aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/en/books/porters-handbook/porting-dads/_index.po
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/en/books/porters-handbook/porting-dads/_index.po')
-rw-r--r--documentation/content/en/books/porters-handbook/porting-dads/_index.po1157
1 files changed, 1157 insertions, 0 deletions
diff --git a/documentation/content/en/books/porters-handbook/porting-dads/_index.po b/documentation/content/en/books/porters-handbook/porting-dads/_index.po
new file mode 100644
index 0000000000..346864fc55
--- /dev/null
+++ b/documentation/content/en/books/porters-handbook/porting-dads/_index.po
@@ -0,0 +1,1157 @@
+# 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.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2023-05-21 14:43-0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: YAML Front Matter: 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 ""
+
+#. type: YAML Front Matter: title
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:1
+#, no-wrap
+msgid "Chapter 13. Dos and Don'ts"
+msgstr ""
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:13
+#, no-wrap
+msgid "Dos and Don'ts"
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:53
+#, no-wrap
+msgid "Introduction"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:59
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:61
+#, no-wrap
+msgid "`WRKDIR`"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:65
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:67
+#, no-wrap
+msgid "`WRKDIRPREFIX`"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:72
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:74
+#, no-wrap
+msgid "Differentiating Operating Systems and OS Versions"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:78
+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 ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:82
+#, no-wrap
+msgid "#include <sys/param.h>\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:85
+msgid "to the proper place in the [.filename]#.c# file."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:88
+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 ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:96
+#, 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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:99
+msgid ""
+"A complete list of `{freebsd-version}` values is available in crossref:"
+"versions[versions,__FreeBSD_version Values]."
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:101
+#, no-wrap
+msgid "Writing Something After bsd.port.mk"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:105
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:109
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:112
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:114
+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 ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:119
+#, no-wrap
+msgid "Variable"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:121
+#, no-wrap
+msgid "Description"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:122
+#, no-wrap
+msgid "`ARCH`"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:124
+#, no-wrap
+msgid "The architecture as returned by `uname -m` (for example, `i386`)"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:125
+#, no-wrap
+msgid "`OPSYS`"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:127
+#, no-wrap
+msgid "The operating system type, as returned by `uname -s` (for example, `FreeBSD`)"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:128
+#, no-wrap
+msgid "`OSREL`"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:130
+#, no-wrap
+msgid "The release version of the operating system (for example, `2.1.5` or `2.2.7`)"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:131
+#, no-wrap
+msgid "`OSVERSION`"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:133
+#, no-wrap
+msgid "The numeric version of the operating system; the same as crossref:versions[versions,`{freebsd-version}`]."
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:134
+#, no-wrap
+msgid "`LOCALBASE`"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:136
+#, no-wrap
+msgid "The base of the \"local\" tree (for example, `/usr/local`)"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:137
+#, no-wrap
+msgid "`PREFIX`"
+msgstr ""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:138
+#, no-wrap
+msgid "Where the port installs itself (see crossref:testing[porting-prefix,more on `PREFIX`])."
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:143
+msgid ""
+"When `MASTERDIR` is needed, always define it before including [."
+"filename]#bsd.port.pre.mk#."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:146
+msgid ""
+"Here are some examples of things that can be added after [.filename]#bsd."
+"port.pre.mk#:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:153
+#, 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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:156
+msgid "Always use tab instead of spaces after `BROKEN=`."
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:158
+#, no-wrap
+msgid "Use the `exec` Statement in Wrapper Scripts"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:163
+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 ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:168
+#, no-wrap
+msgid ""
+"#!/bin/sh\n"
+"exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar \"$@\"\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:173
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:175
+#, no-wrap
+msgid "Do Things Rationally"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:180
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:183
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:185
+#, no-wrap
+msgid "Respect Both `CC` and `CXX`"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:191
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:193
+msgid ""
+"If the port does not respect these variables, please add `NO_PACKAGE=ignores "
+"either cc or cxx` to the [.filename]#Makefile#."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:196
+msgid ""
+"Here is an example of a [.filename]#Makefile# respecting both `CC` and "
+"`CXX`. Note the `?=`:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:200
+#, no-wrap
+msgid "CC?= gcc\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:205
+#, no-wrap
+msgid "CXX?= g++\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:208
+msgid "Here is an example which respects neither `CC` nor `CXX`:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:212
+#, no-wrap
+msgid "CC= gcc\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:217
+#, no-wrap
+msgid "CXX= g++\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:222
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:224
+#, no-wrap
+msgid "Respect `CFLAGS`"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:230
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:232
+msgid ""
+"If it does not, please add `NO_PACKAGE=ignores cflags` to the [."
+"filename]#Makefile#."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:234
+msgid ""
+"Here is an example of a [.filename]#Makefile# respecting `CFLAGS`. Note the "
+"`+=`:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:238
+#, no-wrap
+msgid "CFLAGS+= -Wall -Werror\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:241
+msgid "Here is an example which does not respect `CFLAGS`:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:245
+#, no-wrap
+msgid "CFLAGS= -Wall -Werror\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:250
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:254
+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 ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:258
+#, no-wrap
+msgid "CFLAGS= -O3 -funroll-loops -DHAVE_SOUND\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:261
+msgid ""
+"Using system optimization flags, the [.filename]#Makefile# would look "
+"similar to this example:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:265
+#, no-wrap
+msgid "CFLAGS+= -DHAVE_SOUND\n"
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:268
+#, no-wrap
+msgid "Verbose Build Logs"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:272
+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:274
+msgid "Non-informative build log example (bad):"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:280
+#, no-wrap
+msgid ""
+" CC source1.o\n"
+" CC source2.o\n"
+" CCLD someprogram\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:283
+msgid "Verbose build log example (good):"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:289
+#, 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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:293
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:295
+#, no-wrap
+msgid "Feedback"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:299
+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:301
+#, no-wrap
+msgid "README.html"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:305
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:309
+msgid ""
+"If `make readme` fails, make sure that the default value of `ECHO_MSG` has "
+"not been modified by the port."
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:312
+#, no-wrap
+msgid "Marking a Port Not Installable with `BROKEN`, `FORBIDDEN`, or `IGNORE`"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:319
+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 ""
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:321
+#, no-wrap
+msgid "Variables"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:324
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:327
+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:329
+msgid "For instance, use `BROKEN` when a port:"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:331
+msgid "does not compile"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:332
+msgid "fails its configuration or installation process"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:333
+msgid "installs files outside of [.filename]#${PREFIX}#"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:334
+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:335
+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:337
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:338
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:340
+msgid "does not work on the installed version of FreeBSD"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:341
+msgid ""
+"has a distfile which may not be automatically fetched due to licensing "
+"restrictions"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:342
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:347
+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 ""
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:350
+#, no-wrap
+msgid "Implementation Notes"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:354
+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 ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:358
+#, no-wrap
+msgid "BROKEN=\tfails to link with base -lcrypto\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:363
+#, no-wrap
+msgid "IGNORE=\tunsupported on recent versions\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:366
+msgid "resulting in this output from `make describe`:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:370
+#, no-wrap
+msgid "===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:375
+#, no-wrap
+msgid "===> foobar-0.1 is unsupported on recent versions.\n"
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:378
+#, no-wrap
+msgid "Architectural Considerations"
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:381
+#, no-wrap
+msgid "General Notes on Architectures"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:385
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:387
+msgid "For the list of supported architectures, run:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:391
+#, no-wrap
+msgid "cd ${SRCDIR}; make targets\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:396
+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 ""
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:398
+#, no-wrap
+msgid "Marking a Port as Architecture Neutral"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:401
+msgid ""
+"Ports that do not have any architecture-dependent files or requirements are "
+"identified by setting `NO_ARCH=yes`."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:403
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:409
+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 ""
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:412
+#, 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:415
+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 ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:419
+#, no-wrap
+msgid "ONLY_FOR_ARCHS=\ti386 amd64\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:424
+#, no-wrap
+msgid "NOT_FOR_ARCHS=\tia64 sparc64\n"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:428
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:431
+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 ""
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:433
+#, no-wrap
+msgid "Cluster-Specific Considerations"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:436
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:438
+msgid ""
+"Otherwise, the default package produced by the build cluster might not run "
+"on every single machine of that `ARCH`."
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:440
+#, no-wrap
+msgid "Marking a Port for Removal with `DEPRECATED` or `EXPIRATION_DATE`"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:444
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:448
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:450
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:456
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:461
+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:463
+#, no-wrap
+msgid "Avoid Use of the `.error` Construct"
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:467
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:473
+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 ""
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:475
+#, no-wrap
+msgid "How to Avoid Using `.error`"
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:480
+msgid ""
+"The first of the next two [.filename]#Makefile# snippets will cause `make "
+"index` to fail, while the second one will not:"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:484
+#, no-wrap
+msgid ".error \"option is not supported\"\n"
+msgstr ""
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:489
+#, no-wrap
+msgid "IGNORE=option is not supported\n"
+msgstr ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:494
+#, no-wrap
+msgid "Usage of sysctl"
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:499
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:501
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:503
+#, no-wrap
+msgid "Rerolling Distfiles"
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:508
+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:511
+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 ""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:515
+msgid ""
+"Be sure to summarize the differences in the PR and commit log, so that other "
+"people know that nothing bad has happened."
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:518
+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:520
+#, no-wrap
+msgid "Use POSIX Standards"
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:524
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:527
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:529
+msgid "Do not rely on behavior that is undocumented by POSIX."
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:533
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:537
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:540
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:542
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:544
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:547
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:549
+msgid ""
+"A list of common bashisms is available https://wiki.ubuntu.com/"
+"DashAsBinSh[here]."
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:552
+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 ""
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:554
+#, no-wrap
+msgid "Miscellanea"
+msgstr ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:558
+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 ""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:559
+msgid ""
+"Please be careful to note any legal issues! Do not let us illegally "
+"distribute software!"
+msgstr ""