Home | History | Annotate | Line # | Download | only in src
BUILDING revision 1.160
      1 BUILDING(8)                 System Manager's Manual                BUILDING(8)
      2 
      3 NAME
      4      BUILDING - Procedure for building NetBSD from source code
      5 
      6 REQUIREMENTS
      7      NetBSD is designed to be buildable on most POSIX-compliant host systems.
      8      The basic build procedure is the same whether compiling natively (on the
      9      same NetBSD architecture) or cross compiling (on another architecture or
     10      OS).
     11 
     12      This source tree contains the build.sh shell script which supports both
     13      native and cross builds of NetBSD.
     14 
     15      This source tree contains a special subtree, "tools", which uses the host
     16      system to create a build toolchain for the target architecture.  The host
     17      system must have at least C and C++ compilers in order to create the
     18      toolchain (make(1) is not required); all other tools (including make(1)
     19      as nbmake) are created as part of the NetBSD build process.  (See the
     20      Environment variables section below if you need to override or manually
     21      select your compilers.)
     22 
     23      Note: Within this document, cross-references to manual pages are to the
     24      NetBSD manual pages, not the host system manual pages.  The mdoc(7)
     25      source to the NetBSD manual pages can be found within the source tree,
     26      and these and can be formatted with mandoc(1) or nroff(1) if those are
     27      available on the host system.  The NetBSD manual pages are also available
     28      at https://man.netbsd.org
     29 
     30 FILES
     31    Source tree layout
     32      BUILDING       This document (in plaintext).  Generated from
     33                     doc/BUILDING.mdoc.
     34 
     35      Makefile       The main Makefile for NetBSD; should only be run for
     36                     native builds with an appropriately up-to-date version of
     37                     NetBSD make(1).  Intended for expert use with knowledge of
     38                     its shortcomings, it has been superseded by the build.sh
     39                     shell script as the recommended means for building NetBSD.
     40 
     41      UPDATING       Special notes for updating from an earlier revision of
     42                     NetBSD.  It is important to read this file before every
     43                     build of an updated source tree.
     44 
     45      build.sh       Bourne-compatible shell script used for building the host
     46                     build tools and the NetBSD system from scratch.  Can be
     47                     used for both native and cross builds, and should be used
     48                     instead of make(1) as it performs additional checks to
     49                     prevent common issues going undetected, such as building
     50                     with an outdated version of make(1).
     51 
     52      crypto/dist/, dist/, gnu/dist/
     53                     Sources imported verbatim from third parties, without
     54                     mangling the existing build structure.  Other source trees
     55                     in bin through usr.sbin use the NetBSD make(1) "reachover"
     56                     Makefile semantics when building these programs for a
     57                     native host.
     58 
     59      distrib/, etc/
     60                     Sources for items used when making a full release
     61                     snapshot, such as files installed in DESTDIR/etc on the
     62                     destination system, boot media, and release notes.
     63 
     64      doc/BUILDING.mdoc
     65                     The source to this document, in mdoc(7) format.  Used to
     66                     generate BUILDING.
     67 
     68      external/, sys/external/
     69                     Sources and build infrastructure for components imported
     70                     (mostly) unchanged from upstream maintainers, sorted by
     71                     applicable license.  This is (slowly) replacing the
     72                     crypto/dist, dist, and gnu/dist directories.
     73 
     74      external/mit/xorg/
     75                     "Reachover" build structure for modular Xorg; the source
     76                     is in X11SRCDIR.
     77 
     78      mk.conf        Optional source tree specific mk.conf(5), used (if
     79                     present) instead of /etc/mk.conf unless MAKECONF is
     80                     defined.
     81 
     82                     Note: Not part of the NetBSD source repository.
     83 
     84      regress/, tests/
     85                     Regression test harness.  Can be cross-compiled, but only
     86                     run natively.  tests/ uses the atf(7) test framework;
     87                     regress/ contains older tests that have not yet been
     88                     migrated to atf(7).
     89 
     90      sys/           NetBSD kernel sources.
     91 
     92      tools/         "Reachover" build structure for the host build tools.
     93                     This has a special method of determining out-of-date
     94                     status.
     95 
     96      tools/compat/README
     97                     Special notes for cross-hosting a NetBSD build on non-
     98                     NetBSD platforms.
     99 
    100      Other directories including bin/ ... usr.sbin/
    101                     Sources to the NetBSD userland (non-kernel) programs.  If
    102                     any of these directories are missing, they will be skipped
    103                     during the build.
    104 
    105    Build tree layout
    106      The NetBSD build tree is described in hier(7) (whose mdoc(7) source is in
    107      share/man/man7/hier.7), and the release layout is described in release(7)
    108      (whose mdoc(7) source is in share/man/man7/release.7).
    109 
    110 CONFIGURATION
    111    Environment variables
    112      Several environment variables control the behaviour of NetBSD builds.
    113 
    114      HOST_CC         Path name to C compiler used to create the toolchain.
    115 
    116                      Default: "cc".
    117 
    118      HOST_CFLAGS     Flags passed to the host C compiler.
    119 
    120                      Default: "-O".
    121 
    122      HOST_CPPFLAGS   Flags passed to the host C/C++ pre-processor.
    123 
    124                      Default: Unset.
    125 
    126      HOST_CXX        Path name to C++ compiler used to create the toolchain.
    127 
    128                      Default: Unset, but defaults to "c++" where required.
    129 
    130      HOST_CXXFLAGS   Flags passed to the host C++ compiler.
    131 
    132                      Default: Unset.
    133 
    134      HOST_SH         Path name to a shell available on the host system and
    135                      suitable for use during the build.  The NetBSD build
    136                      system requires a modern Bourne-like shell with POSIX-
    137                      compliant features, and also requires support for the
    138                      "local" keyword to declare local variables in shell
    139                      functions (which is a widely-implemented but non-
    140                      standardised feature).
    141 
    142                      Depending on the host system, a suitable shell may be
    143                      /bin/sh, /usr/xpg4/bin/sh, /bin/ksh (provided it is a
    144                      variant of ksh that supports the "local" keyword, such as
    145                      ksh88, but not ksh93), or /usr/local/bin/bash.
    146 
    147                      Most parts of the build require HOST_SH to be an absolute
    148                      path; however, build.sh allows it to be a simple command
    149                      name, which will be converted to an absolute path by
    150                      searching the PATH.
    151 
    152                      Default: "sh".
    153 
    154      INSTALLBOOT_UBOOT_PATHS
    155                      A colon-separated list of search paths used by
    156                      installboot(8) to find U-Boot packages.
    157 
    158                      Default: Unset.
    159 
    160      MACHINE         Machine type, e.g., "macppc".
    161 
    162                      Default: Unset.
    163 
    164      MACHINE_ARCH    Machine architecture, e.g., "powerpc".
    165 
    166                      Default: Unset.
    167 
    168      MAKE            Path name to invoke make(1) as.
    169 
    170                      Default: "make".
    171 
    172      MAKECONF        The name of the make(1) configuration file.  See make
    173                      variables and mk.conf(5).
    174 
    175                      Note: Only settable in the process environment.
    176 
    177                      Default: "/etc/mk.conf", although build.sh will set the
    178                      default to the full path to mk.conf if the latter is
    179                      present in the same directory as build.sh.
    180 
    181      MAKEFLAGS       Flags to invoke make(1) with.
    182 
    183                      Note: build.sh ignores the value of MAKEFLAGS passed in
    184                      the environment, but allows MAKEFLAGS to be set via the
    185                      -V option.
    186 
    187                      Default: "-X" on systems with a small ARG_MAX (Cygwin,
    188                      Darwin, FreeBSD); otherwise unset.
    189 
    190      MAKEOBJDIR      Directory to use as the .OBJDIR for the current
    191                      directory.  The value is subjected to variable expansion
    192                      by make(1).  Typical usage is to set this variable to a
    193                      value involving the use of `${.CURDIR:S...}' or
    194                      `${.CURDIR:C...}', to derive the value of .OBJDIR from
    195                      the value of .CURDIR.  Used only if MAKEOBJDIRPREFIX is
    196                      not defined.
    197 
    198                      Note: MAKEOBJDIR can be provided only in the environment
    199                      or via the -O flag of build.sh; it cannot usefully be set
    200                      inside a Makefile, including in mk.conf(5) or MAKECONF.
    201 
    202                      Default: Unset.
    203 
    204      MAKEOBJDIRPREFIX
    205                      Top level directory of the object directory tree.  The
    206                      value is subjected to variable expansion by make(1).
    207                      build.sh will create the ${MAKEOBJDIRPREFIX} directory if
    208                      necessary, but if make(1) is used without build.sh, then
    209                      rules in <bsd.obj.mk> will abort the build if the
    210                      ${MAKEOBJDIRPREFIX} directory does not exist.  If the
    211                      value is defined and valid, then
    212                      ${MAKEOBJDIRPREFIX}/${.CURDIR} is used as the .OBJDIR for
    213                      the current directory.  The current directory may be read
    214                      only.
    215 
    216                      Note: MAKEOBJDIRPREFIX can be provided only in the
    217                      environment or via the -M flag of build.sh; it cannot
    218                      usefully be set inside a Makefile, including in
    219                      mk.conf(5) or MAKECONF.
    220 
    221                      Default: Unset.
    222 
    223      TMPDIR          Top-level directory to store temporary directories used
    224                      by build.sh before paths to other directories such as
    225                      .OBJDIR can be determined.
    226 
    227                      Note: Must support execution of binaries.  I.e., without
    228                      mount(8)'s -o noexec option.
    229 
    230                      Default: "/tmp".
    231 
    232    make variables
    233      Variables that control the behavior of NetBSD builds are documented in
    234      mk.conf(5) (whose mdoc(7) source is in share/man/man5/mk.conf.5).
    235 
    236      Unless otherwise specified, these variables may be set in either the
    237      process environment or the make(1) configuration file mk.conf(5)
    238      specified by MAKECONF.
    239 
    240      Note: Variables set in the environment, either directly or via build.sh
    241      options to set specific values in the nbmake-MACHINE wrapper script do
    242      not override variables set in the mk.conf(5) file.  To allow variables in
    243      mk.conf(5) to be overridden by the environment or build.sh options,
    244      define the variables using the "?=" make(1) variable assignment operator.
    245      For example,
    246 
    247            MAKEVERBOSE?=1
    248 
    249      The supported mk.conf(5) make variables are:
    250 
    251            BSDOBJDIR, BSDSRCDIR, BUILD, BUILDID, BUILDINFO, BUILDSEED,
    252            CDEXTRA, CONFIGOPTS, COPTS, CPUFLAGS, DESTDIR, EXTERNAL_TOOLCHAIN,
    253            INSTALLBOOT_BOARDS, INSTALLWORLDDIR, KERNARCHDIR, KERNCONFDIR,
    254            KERNEL_DIR, KERNOBJDIR, KERNSRCDIR, LOCALTIME, MAKEVERBOSE,
    255            MKAMDGPUFIRMWARE, MKARGON2, MKARZERO, MKATF, MKBINUTILS, MKBSDGREP,
    256            MKBSDTAR, MKCATPAGES, MKCLEANSRC, MKCLEANVERIFY, MKCOMPAT,
    257            MKCOMPATMODULES, MKCOMPATTESTS, MKCOMPATX11, MKCOMPLEX, MKCROSSGDB,
    258            MKCTF, MKCVS, MKCXX, MKDEBUG, MKDEBUGKERNEL, MKDEBUGLIB,
    259            MKDEBUGTOOLS, MKDEPINCLUDES, MKDOC, MKDTB, MKDTC, MKDTRACE,
    260            MKDYNAMICROOT, MKFIRMWARE, MKGCC, MKGCCCMDS, MKGDB, MKGROFF,
    261            MKGROFFHTMLDOC, MKHESIOD, MKHOSTOBJ, MKHTML, MKIEEEFP, MKINET6,
    262            MKINFO, MKIPFILTER, MKISCSI, MKKERBEROS, MKKMOD, MKKYUA, MKLDAP,
    263            MKLIBCSANITIZER, MKLIBCXX, MKLIBSTDCXX, MKLINKLIB, MKLINT, MKLLVM,
    264            MKLLVMRT, MKLVM, MKMAKEMANDB, MKMAN, MKMANDOC, MKMANZ, MKMDNS,
    265            MKNLS, MKNOUVEAUFIRMWARE, MKNPF, MKNSD, MKOBJ, MKOBJDIRS, MKPAM,
    266            MKPCC, MKPF, MKPIC, MKPICINSTALL, MKPICLIB, MKPIE, MKPIGZGZIP,
    267            MKPOSTFIX, MKPROFILE, MKRADEONFIRMWARE, MKRELRO, MKREPRO,
    268            MKREPRO_TIMESTAMP, MKRUMP, MKSANITIZER, MKSHARE, MKSKEY, MKSLJIT,
    269            MKSOFTFLOAT, MKSTATICLIB, MKSTATICPIE, MKSTRIPIDENT, MKSTRIPSYM,
    270            MKTEGRAFIRMWARE, MKTPM, MKUNBOUND, MKUNPRIVED, MKUPDATE, MKX11,
    271            MKX11FONTS, MKX11MOTIF, MKXORG_SERVER, MKYP, MKZFS, NETBSDSRCDIR,
    272            NETBSD_OFFICIAL_RELEASE, NOCLEANDIR, NODISTRIBDIRS, NOINCLUDES,
    273            OBJMACHINE, RELEASEDIR, RUMPUSER_THREADS, RUMP_CURLWP, RUMP_DEBUG,
    274            RUMP_DIAGNOSTIC, RUMP_KTRACE, RUMP_LOCKDEBUG, RUMP_LOCKS_UP,
    275            RUMP_NBCOMPAT, RUMP_VIRTIF, RUMP_VNODE_LOCKDEBUG,
    276            TOOLCHAIN_MISSING, TOOLDIR, USETOOLS, USE_FORT, USE_HESIOD,
    277            USE_INET6, USE_JEMALLOC, USE_KERBEROS, USE_LDAP, USE_LIBCSANITIZER,
    278            USE_PAM, USE_PIGZGZIP, USE_SANITIZER, USE_SKEY, USE_SSP,
    279            USE_XZ_SETS, USE_YP, X11MOTIFPATH, X11SRCDIR.
    280 
    281      The obsolete mk.conf(5) make variables are:
    282 
    283            EXTSRCSRCDIR, MKBFD, MKCRYPTO, MKEXTSRC, MKKDEBUG, MKKERBEROS4,
    284            MKLLD, MKLLDB, MKMCLINKER, MKPERFUSE, MKTOOLSDEBUG, NBUILDJOBS,
    285            SHAREDSTRINGS, USE_COMBINE, USE_NEW_TOOLCHAIN.
    286 
    287 BUILDING
    288    make command line options
    289      This is not a summary of all the options available to make(1); only the
    290      options used most frequently with NetBSD builds are listed here.
    291 
    292      -j njob    Run up to njob make(1) subjobs in parallel.  Makefiles should
    293                 use .WAIT or have explicit dependencies as necessary to
    294                 enforce build ordering.
    295 
    296      -m dir     Specify the default directory for searching for system
    297                 Makefile segments, mainly the <bsd.*.mk> files.  When building
    298                 any full NetBSD source tree, this should be set to the
    299                 "share/mk" directory in the source tree.  This is set
    300                 automatically when building from the top level, or when using
    301                 build.sh.
    302 
    303      -n         Show the commands that would have been executed, but do not
    304                 actually execute them.  This will still cause recursion to
    305                 take place.
    306 
    307      -V var     Show make(1)'s idea of the value of var.  Does not build any
    308                 targets.
    309 
    310      var=value  Set the variable var to value, overriding any setting
    311                 specified by the process environment, the MAKECONF
    312                 configuration file, or the system Makefile segments.
    313 
    314    make targets
    315      These default targets may be built by running make(1) in any subtree of
    316      the NetBSD source code.  It is recommended that none of these be used
    317      from the top level Makefile; as a specific exception, "make obj" and
    318      "make cleandir" are useful in that context.
    319 
    320      all        Build programs, libraries, and preformatted documentation.
    321 
    322      clean      Remove program and library object code files.
    323 
    324      cleandir   Same as clean, but also remove preformatted documentation,
    325                 dependency files generated by "make depend", and any other
    326                 files known to be created at build time.
    327 
    328      depend     Create dependency files (.depend) containing more detailed
    329                 information about the dependencies of source code on header
    330                 files.  Allows programs to be recompiled automatically when a
    331                 dependency changes.
    332 
    333      dependall  Does a "make depend" immediately followed by a "make all".
    334                 This improves cache locality of the build since both passes
    335                 read the source files in their entirety.
    336 
    337      distclean  Synonym for cleandir.
    338 
    339      includes   Build and install system header files.  Typically needed
    340                 before any system libraries or programs can be built.
    341 
    342      install    Install programs, libraries, and documentation into DESTDIR.
    343                 Few files will be installed to DESTDIR/dev, DESTDIR/etc,
    344                 DESTDIR/root or DESTDIR/var in order to prevent user supplied
    345                 configuration data from being overwritten.
    346 
    347      lint       Run lint(1) against the C source code, where appropriate, and
    348                 generate system-installed lint libraries.
    349 
    350      obj        Create object directories to be used for built files, instead
    351                 of building directly in the source tree.
    352 
    353      tags       Create ctags(1) searchable function lists usable by the ex(1)
    354                 and vi(1) text editors.
    355 
    356    make targets for the top level
    357      Additional make(1) targets are usable specifically from the top source
    358      level to facilitate building the entire NetBSD source tree.
    359 
    360      build         Build the entire NetBSD system (except the kernel).  This
    361                    orders portions of the source tree such that prerequisites
    362                    will be built in the proper order.
    363 
    364      distribution  Do a "make build", and then install a full distribution
    365                    (which does not include a kernel) into DESTDIR, including
    366                    files in DESTDIR/dev, DESTDIR/etc, DESTDIR/root and
    367                    DESTDIR/var.
    368 
    369      buildworld    As per "make distribution", except that it ensures that
    370                    DESTDIR is not the root directory.
    371 
    372      installworld  Install the distribution from DESTDIR to INSTALLWORLDDIR,
    373                    which defaults to the root directory.  Ensures that
    374                    INSTALLWORLDDIR is not the root directory if cross
    375                    compiling.
    376 
    377                    The INSTALLSETS environment variable may be set to a space-
    378                    separated list of distribution sets to be installed.  By
    379                    default, all sets except "etc" and "xetc" are installed, so
    380                    most files in INSTALLWORLDDIR/etc will not be installed or
    381                    modified.
    382 
    383                    Note: Before performing this operation with
    384                    INSTALLWORLDDIR=/, it is highly recommended that you
    385                    upgrade your kernel and reboot.  After performing this
    386                    operation, it is recommended that you use etcupdate(8) to
    387                    update files in INSTALLWORLDDIR/etc, and postinstall(8) to
    388                    check for or fix inconsistencies.
    389 
    390      sets          Create distribution sets from DESTDIR into
    391                    RELEASEDIR/RELEASEMACHINEDIR/binary/sets.  Should be run
    392                    after "make distribution", as "make build" alone does not
    393                    install all of the required files.
    394 
    395      sourcesets    Create source sets of the source tree into
    396                    RELEASEDIR/source/sets.
    397 
    398      syspkgs       Create syspkgs from DESTDIR into
    399                    RELEASEDIR/RELEASEMACHINEDIR/binary/syspkgs.  Should be run
    400                    after "make distribution", as "make build" alone does not
    401                    install all of the required files.
    402 
    403      release       Do a "make distribution", build kernels, distribution
    404                    media, and install sets (this as per "make sets"), and then
    405                    package the system into a standard release layout as
    406                    described by release(7).  This requires that RELEASEDIR be
    407                    set (see above).
    408 
    409      iso-image     Create a NetBSD installation CD-ROM image in the
    410                    RELEASEDIR/images directory.  The CD-ROM file system will
    411                    have a layout as described in release(7).
    412 
    413                    For most machine types, the CD-ROM will be bootable, and
    414                    will automatically run the sysinst(8) menu-based
    415                    installation program, which can be used to install or
    416                    upgrade a NetBSD system.  Bootable CD-ROMs also contain
    417                    tools that may be useful in repairing a damaged NetBSD
    418                    installation.
    419 
    420                    Before "make iso-image" is attempted, RELEASEDIR must be
    421                    populated by "make release" or equivalent.
    422 
    423                    Note: Other, smaller, CD-ROM images may be created in the
    424                    RELEASEDIR/RELEASEMACHINEDIR/installation/cdrom directory
    425                    by "make release".  These smaller images usually contain
    426                    the same tools as the larger images in RELEASEDIR/images,
    427                    but do not contain additional content such as the
    428                    distribution sets.
    429 
    430                    Note: The mac68k port still uses an older method of
    431                    creating CD-ROM images.  This requires the mkisofs(1)
    432                    utility, which is not part of NetBSD, but which can be
    433                    installed from pkgsrc/sysutils/cdrtools.
    434 
    435      iso-image-source
    436                    Create a NetBSD installation CD-ROM image in the
    437                    RELEASEDIR/images directory.  The CD-ROM file system will
    438                    have a layout as described in release(7).  It will have top
    439                    level directories for the machine type and source.
    440 
    441                    For most machine types, the CD-ROM will be bootable, and
    442                    will automatically run the sysinst(8) menu-based
    443                    installation program, which can be used to install or
    444                    upgrade a NetBSD system.  Bootable CD-ROMs also contain
    445                    tools that may be useful in repairing a damaged NetBSD
    446                    installation.
    447 
    448                    Before "make iso-image-source" is attempted, RELEASEDIR
    449                    must be populated by "make sourcesets release" or
    450                    equivalent.
    451 
    452                    Note: Other, smaller, CD-ROM images may be created in the
    453                    RELEASEDIR/RELEASEMACHINEDIR/installation/cdrom directory
    454                    by "make release".  These smaller images usually contain
    455                    the same tools as the larger images in RELEASEDIR/images,
    456                    but do not contain additional content such as the
    457                    distribution sets.
    458 
    459                    Note: The mac68k port still uses an older method of
    460                    creating CD-ROM images.  This requires the mkisofs(1)
    461                    utility, which is not part of NetBSD, but which can be
    462                    installed from pkgsrc/sysutils/cdrtools.
    463 
    464      install-image
    465                    Create a bootable NetBSD installation disk image in the
    466                    RELEASEDIR/images directory.  The installation disk image
    467                    is suitable for copying to bootable USB flash memory
    468                    sticks, etc., for machines which are able to boot from such
    469                    devices.  The file system in the bootable disk image will
    470                    have a layout as described in release(7).
    471 
    472                    The installation image is bootable, and will automatically
    473                    run the sysinst(8) menu-based installation program, which
    474                    can be used to install or upgrade a NetBSD system.  The
    475                    image also contains tools that may be useful in repairing a
    476                    damaged NetBSD installation.
    477 
    478                    Before "make install-image" is attempted, RELEASEDIR must
    479                    be populated by "make release" or equivalent.  The build
    480                    must have been performed with MKUNPRIVED=yes because "make
    481                    install-image" relies on information in DESTDIR/METALOG.
    482 
    483      live-image    Create NetBSD live images in the RELEASEDIR/images
    484                    directory.  The live image contains all necessary files to
    485                    boot NetBSD up to multi-user mode, including all files
    486                    which should be extracted during installation, NetBSD
    487                    disklabel, bootloaders, etc.
    488 
    489                    The live image is suitable for use as a disk image in
    490                    virtual machine environments such as QEMU, and also useful
    491                    to boot NetBSD from a USB flash memory stick on a real
    492                    machine, without the need for installation.
    493 
    494                    Before "make live-image" is attempted, RELEASEDIR must be
    495                    populated by "make release" or equivalent.  The build must
    496                    have been performed with MKUNPRIVED=yes because "make
    497                    install-image" relies on information in DESTDIR/METALOG.
    498 
    499      regression-tests
    500                    Can only be run after building the regression tests in the
    501                    directory "regress".  Runs those compiled regression tests
    502                    on the local host.
    503 
    504                    Note: Most tests are now managed instead using atf(7); this
    505                    target should probably run those as well but currently does
    506                    not.
    507 
    508    The build.sh script
    509      This script file is a shell script designed to build the entire NetBSD
    510      system on any host with a suitable modern shell and some common
    511      utilities.  The required shell features are described under the HOST_SH
    512      variable.
    513 
    514      If a host system's default shell does support the required features, then
    515      we suggest that you explicitly specify a suitable shell using a command
    516      like
    517 
    518            /path/to/suitable/shell build.sh [options]
    519 
    520      The above command will usually enable build.sh to automatically set
    521      HOST_SH=/path/to/suitable/shell, but if that fails, then the following
    522      set of commands may be used instead:
    523 
    524            HOST_SH=/path/to/suitable/shell
    525            export HOST_SH
    526            ${HOST_SH} build.sh [options]
    527 
    528      If build.sh detects that it is being executed under an unsuitable shell,
    529      it attempts to exec a suitable shell instead, or shows an error message.
    530      If HOST_SH is not set explicitly, then build.sh sets a default using
    531      heuristics dependent on the host platform, or from the shell under which
    532      build.sh is executed (if that can be determined), or using the first copy
    533      of sh found in PATH.
    534 
    535      All cross-compile builds, and most native builds, of the entire system
    536      should make use of build.sh rather than just running "make".  This way,
    537      the make(1) program will be bootstrapped properly, in case the host
    538      system has an older or incompatible "make" program.
    539 
    540      When compiling the entire system via build.sh, many make(1) variables are
    541      set for you in order to help encapsulate the build process.  In the list
    542      of options below, variables that are automatically set by build.sh are
    543      noted where applicable.
    544 
    545      The following operations are supported by build.sh:
    546 
    547      build         Build the system as per "make build".  Before the main part
    548                    of the build commences, this command runs the obj operation
    549                    (unless the -o option is given), "make cleandir" (unless
    550                    the -u option is given), and the tools operation.
    551 
    552      distribution  Build a full distribution as per "make distribution".  This
    553                    command first runs the build operation.
    554 
    555      release       Build a full release as per "make release".  This command
    556                    first runs the distribution operation.
    557 
    558      help          Show a help message, and exit.
    559 
    560      makewrapper   Create the nbmake-MACHINE wrapper script.  This operation
    561                    is automatically performed for any of the other operations.
    562 
    563      cleandir      Perform "make cleandir".
    564 
    565      obj           Perform "make obj".
    566 
    567      tools         Build and install the host tools from src/tools.  This
    568                    command will first run "make obj" and "make cleandir" in
    569                    the tools subdirectory unless the -o or -u options
    570                    (respectively) are given.
    571 
    572      install=idir  Install the contents of DESTDIR to idir, using "make
    573                    installworld".
    574 
    575                    Note: Files that are part of the "etc" or "xetc" sets will
    576                    not be installed, unless overridden by the INSTALLSETS
    577                    environment variable.
    578 
    579      kernel=kconf  Build a new kernel.  The kconf argument is the name of a
    580                    configuration file suitable for use by config(1).  If kconf
    581                    does not contain any `/' characters, the configuration file
    582                    is expected to be found in the KERNCONFDIR directory, which
    583                    is typically sys/arch/MACHINE/conf.  The new kernel will be
    584                    built in a subdirectory of KERNOBJDIR, which is typically
    585                    sys/arch/MACHINE/compile or an associated object directory.
    586 
    587                    This command does not imply the tools command; run the
    588                    tools command first unless it is certain that the tools
    589                    already exist and are up to date.
    590 
    591                    This command will run "make cleandir" on the kernel in
    592                    question first unless the -u option is given.
    593 
    594      kernel.gdb=kconf
    595                    Build a new kernel with debug information.  Similar to the
    596                    above kernel=kconf operation, but creates a netbsd.gdb file
    597                    alongside of the kernel netbsd, which contains a full
    598                    symbol table and can be used for debugging (for example
    599                    with a cross-gdb built by MKCROSSGDB).
    600 
    601      kernels       This command will build all kernels defined in port
    602                    specific release build procedure.
    603 
    604                    This command internally calls the kernel=kconf operation
    605                    for each found kernel configuration file.
    606 
    607      modules       This command will build kernel modules and install them
    608                    into DESTDIR.
    609 
    610      releasekernel=kconf
    611                    Install a gzip(1)ed copy of the kernel previously built by
    612                    kernel=kconf into
    613                    RELEASEDIR/RELEASEMACHINEDIR/binary/kernel, usually as
    614                    netbsd-kconf.gz, although the "netbsd" prefix is determined
    615                    from the "config" directives in kconf.
    616 
    617      sets          Perform "make sets".
    618 
    619      sourcesets    Perform "make sourcesets".
    620 
    621      syspkgs       Perform "make syspkgs".
    622 
    623      iso-image     Perform "make iso-image".
    624 
    625      iso-image-source
    626                    Perform "make iso-image-source".
    627 
    628      install-image
    629                    Perform "make install-image".
    630 
    631      live-image    Perform "make live-image".
    632 
    633      list-arch     Show a list of valid MACHINE and MACHINE_ARCH settings, the
    634                    default MACHINE_ARCH for each MACHINE, and aliases for
    635                    MACHINE/MACHINE_ARCH pairs, and then exits.  The -m or -a
    636                    options (or both) may be used to specify glob patterns that
    637                    will be used to narrow the list of results; for example,
    638                    "build.sh -m 'evb*' -a '*arm*' list-arch" will list all
    639                    known MACHINE/MACHINE_ARCH values in which either MACHINE
    640                    or ALIAS matches the pattern `evb*', and MACHINE_ARCH
    641                    matches the pattern `*arm*'.
    642 
    643      The following command line options alter the behaviour of the build.sh
    644      operations described above:
    645 
    646      -a arch   Set the value of MACHINE_ARCH to arch.  See the -m option for
    647                more information.
    648 
    649      -B buildid
    650                Set the value of BUILDID to buildid.  This will also append the
    651                build identifier to the name of the nbmake-MACHINE wrapper
    652                script so that the resulting name is of the form
    653                "nbmake-MACHINE-BUILDID".
    654 
    655      -C cdextras
    656                Append cdextras to the CDEXTRA variable, which is a space-
    657                separated list of files or directories that will be added to
    658                the CD-ROM image that may be create by the "iso-image" or
    659                "iso-image-source" operations.  Files will be added to the root
    660                of the CD-ROM image, whereas directories will be copied
    661                recursively.  If relative paths are specified, they will be
    662                converted to absolute paths before being used.  Multiple paths
    663                may be specified via multiple -C options, or via a single
    664                option whose argument contains multiple space-separated paths.
    665 
    666      -c compiler
    667                Select the compiler for the toolchain to build NetBSD and for
    668                inclusion in the NetBSD distribution.  Supported choices:
    669 
    670                      clang
    671 
    672                      gcc [default]
    673 
    674                The compiler used to build the toolchain can be different; see
    675                HOST_CC and HOST_CXX.
    676 
    677      -D dest   Set the value of DESTDIR to dest.  If a relative path is
    678                specified, it will be converted to an absolute path before
    679                being used.
    680 
    681      -E        Set `expert' mode.  This overrides various sanity checks, and
    682                allows: DESTDIR does not have to be set to a non-root path for
    683                builds, and MKUNPRIVED=yes does not have to be set when
    684                building as a non-root user.
    685 
    686                Note: It is highly recommended that you know what you are doing
    687                when you use this option.
    688 
    689      -h        Show a help message, and exit.
    690 
    691      -j njob   Run up to njob make(1) subjobs in parallel; passed through to
    692                make(1).  If you see failures for reasons other than running
    693                out of memory while using build.sh with -j, please save
    694                complete build logs so the failures can be analyzed.
    695 
    696                To achieve the fastest builds, -j values between (1 + the
    697                number of CPUs) and (2 * the number of CPUs) are recommended.
    698                Use lower values on machines with limited memory or I/O
    699                bandwidth.
    700 
    701      -M obj    Set MAKEOBJDIRPREFIX to obj.  Unsets MAKEOBJDIR.  See "-O obj"
    702                for more information.
    703 
    704                For instance, if the source directory is /usr/src, a setting of
    705                "-M /usr/obj" will place build-time files under
    706                /usr/obj/usr/src/bin, /usr/obj/usr/src/lib,
    707                /usr/obj/usr/src/usr.bin, and so forth.
    708 
    709                If a relative path is specified, it will be converted to an
    710                absolute path before being used.  build.sh imposes the
    711                restriction that the argument to the -M option must not begin
    712                with a "$" (dollar sign) character; otherwise it would be too
    713                difficult to determine whether the value is an absolute or a
    714                relative path.  If the directory does not already exist,
    715                build.sh will create it.
    716 
    717      -m mach   Set the value of MACHINE to mach, unless the mach argument is
    718                an alias that refers to a MACHINE/MACHINE_ARCH pair, in which
    719                case both MACHINE and MACHINE_ARCH are set from the alias.
    720                Such aliases are interpreted entirely by build.sh; they are not
    721                used by any other part of the build system.  The MACHINE_ARCH
    722                setting implied by mach will override any value of MACHINE_ARCH
    723                in the process environment, but will not override a value set
    724                by the -a option.  All cross builds require -m, but if unset on
    725                a NetBSD host, the host's value of MACHINE will be detected and
    726                used automatically.
    727 
    728                See the list-arch operation for a way to get a list of valid
    729                MACHINE and MACHINE_ARCH settings.
    730 
    731      -N noiselevel
    732                Set the "noisyness" level of the build, by setting MAKEVERBOSE
    733                to noiselevel.
    734 
    735      -n        Show the commands that would be executed by build.sh, but do
    736                not make any changes.  This is similar in concept to "make -n".
    737 
    738      -O obj    Create an appropriate transform macro for MAKEOBJDIR that will
    739                place the built object files under obj.  Unsets
    740                MAKEOBJDIRPREFIX.
    741 
    742                For instance, a setting of "-O /usr/obj" will place build-time
    743                files under /usr/obj/bin, /usr/obj/lib, /usr/obj/usr.bin, and
    744                so forth.
    745 
    746                If a relative path is specified, it will be converted to an
    747                absolute path before being used.  build.sh imposes the
    748                restriction that the argument to the -O option must not contain
    749                a "$" (dollar sign) character.  If the directory does not
    750                already exist, build.sh will create it.
    751 
    752                In normal use, exactly one of the -M or -O options should be
    753                specified.  If neither -M nor -O is specified, then a default
    754                object directory will be chosen according to rules in
    755                <bsd.obj.mk>.  Relying on this default is not recommended
    756                because it is determined by complex rules that are influenced
    757                by the values of several variables and by the location of the
    758                source directory.
    759 
    760                Note: Placing the obj directory location outside of the default
    761                source tree hierarchy makes it easier to manually clear out old
    762                files in the event the "make cleandir" operation is unable to
    763                do so.  (See CAVEATS below.)
    764 
    765                Note: The use of one of -M or -O is the only means of building
    766                multiple machine architecture userlands from the same source
    767                tree without cleaning between builds (in which case, one would
    768                specify distinct obj locations for each).
    769 
    770      -o        Set the value of MKOBJDIRS to "no".  Otherwise, it will be
    771                automatically set to "yes".  This default is opposite to the
    772                behaviour when not using build.sh.
    773 
    774      -P        Set the value of MKREPRO and MKREPRO_TIMESTAMP to the latest
    775                source CVS timestamp for reproducible builds.
    776 
    777      -R rel    Set the value of RELEASEDIR to rel.  If a relative path is
    778                specified, it will be converted to an absolute path before
    779                being used.
    780 
    781      -r        Remove the contents of DESTDIR and TOOLDIR before building
    782                (provides a clean starting point).  This will skip deleting
    783                DESTDIR if building on a native system to the root directory.
    784 
    785      -S seed   Change the value of BUILDSEED to seed.  This should rarely be
    786                necessary.
    787 
    788      -T tools  Set the value of TOOLDIR to tools.  If a relative path is
    789                specified, it will be converted to an absolute path before
    790                being used.  If set, the bootstrap "make" will only be rebuilt
    791                if the source files for make(1) have changed.
    792 
    793      -U        Set MKUNPRIVED=yes.
    794 
    795      -u        Set MKUPDATE=yes.
    796 
    797      -V var=[value]
    798                Set the environment variable var to an optional value.  This is
    799                propagated to the nbmake-MACHINE wrapper script.
    800 
    801      -w wrapper
    802                Create the nbmake-MACHINE wrapper script (see below) in a
    803                custom location, specified by wrapper.  This allows, for
    804                instance, to place the wrapper script in PATH automatically.
    805 
    806                Note: wrapper is the full name of the file, not just a
    807                directory name.  If a relative path is specified, it will be
    808                converted to an absolute path before being used.
    809 
    810      -X x11src
    811                Set the value of X11SRCDIR to x11src.  If a relative path is
    812                specified, it will be converted to an absolute path before
    813                being used.
    814 
    815      -x        Set MKX11=yes.
    816 
    817      -Z var    Unset ("zap") the environment variable var.  This is propagated
    818                to the nbmake-MACHINE wrapper script.
    819 
    820      -?        Show a help message, and exit.
    821 
    822    The nbmake-MACHINE wrapper script
    823      If using the build.sh script to build NetBSD, a nbmake-MACHINE wrapper
    824      script will be created in TOOLDIR/bin upon the first build to assist in
    825      building subtrees on a cross-compile host.
    826 
    827      The nbmake-MACHINE wrapper script can be invoked in lieu of make(1), and
    828      will instead call the up-to-date version of "nbmake" installed into
    829      TOOLDIR/bin with several key variables pre-set, including MACHINE,
    830      MACHINE_ARCH, and TOOLDIR.  nbmake-MACHINE will also set variables
    831      specified with -V, and unset variables specified with -Z.  Note that by
    832      default these variables will not override mk.conf(5); see make variables
    833      for more details.
    834 
    835      This wrapper script can be symlinked into a directory listed in PATH, or
    836      called with an absolute path.
    837 
    838 EXAMPLES
    839      1.   % ./build.sh [OPTIONS] tools kernel=GENERIC
    840 
    841           Build a new toolchain, and use the new toolchain to configure and
    842           build a new GENERIC kernel.
    843 
    844      2.   % ./build.sh [OPTIONS] -U distribution
    845 
    846           Using unprivileged mode, build a complete distribution to a DESTDIR
    847           directory that build.sh selects (and will show).
    848 
    849      3.   # ./build.sh [OPTIONS] -U install=/
    850 
    851           As root, install to / the distribution that was built by example 2.
    852           Even though this is run as root, -U is required so that the
    853           permissions stored in DESTDIR/METALOG are correctly applied to the
    854           files as they're copied to /.
    855 
    856      4.   % ./build.sh [OPTIONS] -U -u release
    857 
    858           Using unprivileged mode, build a complete release to DESTDIR and
    859           RELEASEDIR directories that build.sh selects (and will show).
    860           MKUPDATE=yes (-u) is set to prevent the "make cleandir", so that if
    861           this is run after example 2, it doesn't need to redo that portion of
    862           the release build.
    863 
    864 SEE ALSO
    865      config(1), ctags(1), ex(1), gzip(1), lint(1), make(1), mandoc(1),
    866      mkisofs(1), nroff(1), vi(1), mk.conf(5), atf(7), hier(7), mdoc(7),
    867      release(7), etcupdate(8), installboot(8), mount(8), postinstall(8),
    868      sysinst(8), pkgsrc/sysutils/cdrtools
    869 
    870      Note: The NetBSD manual pages are also available at
    871      https://man.netbsd.org
    872 
    873 HISTORY
    874      The build.sh based build scheme was introduced for NetBSD 1.6 as
    875      USE_NEW_TOOLCHAIN, and re-worked to TOOLCHAIN_MISSING after that.
    876 
    877 CAVEATS
    878      After significant updates to third-party components in the source tree,
    879      the "make cleandir" operation may be insufficient to clean out old files
    880      in object directories.  Instead, one may have to manually remove the
    881      files.  Consult the UPDATING file for notices concerning this.
    882 
    883 NetBSD                           July 21, 2023                          NetBSD
    884