Home | History | Annotate | Line # | Download | only in src
      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, MKBSDDIFF,
    256            MKBSDGREP, MKBSDTAR, MKCATPAGES, MKCLEANSRC, MKCLEANVERIFY,
    257            MKCOMPAT, MKCOMPATMODULES, MKCOMPATTESTS, MKCOMPATX11, MKCOMPLEX,
    258            MKCROSSGDB, MKCTF, MKCVS, MKCXX, MKDEBUG, MKDEBUGKERNEL,
    259            MKDEBUGLIB, MKDEBUGTOOLS, MKDEPINCLUDES, MKDOC, MKDTB, MKDTC,
    260            MKDTRACE, MKDYNAMICROOT, MKFIRMWARE, MKGCC, MKGCCCMDS, MKGDB,
    261            MKGROFF, MKGROFFHTMLDOC, MKHESIOD, MKHOSTOBJ, MKHTML, MKIEEEFP,
    262            MKINET6, MKINFO, MKIPFILTER, MKISCSI, MKKERBEROS, MKKMOD, MKKYUA,
    263            MKLDAP, MKLIBCSANITIZER, MKLIBCXX, MKLIBSTDCXX, MKLINKLIB, MKLINT,
    264            MKLLVM, MKLLVMRT, MKLVM, MKMAKEMANDB, MKMAN, MKMANDOC, MKMANZ,
    265            MKMDNS, MKNLS, MKNOUVEAUFIRMWARE, MKNPF, MKNSD, MKOBJ, MKOBJDIRS,
    266            MKPAM, MKPCC, MKPF, MKPIC, MKPICINSTALL, MKPICLIB, MKPIE,
    267            MKPIGZGZIP, MKPOSTFIX, MKPROFILE, MKRADEONFIRMWARE, MKRELRO,
    268            MKREPRO, MKREPRO_TIMESTAMP, MKRUMP, MKSANITIZER, MKSHARE, MKSKEY,
    269            MKSLJIT, MKSOFTFLOAT, MKSTATICLIB, MKSTATICPIE, MKSTRIPIDENT,
    270            MKSTRIPSYM, MKTEGRAFIRMWARE, MKTPM, MKUNBOUND, MKUNPRIVED,
    271            MKUPDATE, MKX11, MKX11FONTS, MKX11MOTIF, MKXORG_SERVER, MKYP,
    272            MKZFS, NETBSDSRCDIR, NETBSD_OFFICIAL_RELEASE, NOCLEANDIR,
    273            NODISTRIBDIRS, NOINCLUDES, OBJMACHINE, RELEASEDIR,
    274            RUMPUSER_THREADS, RUMP_CURLWP, RUMP_DEBUG, RUMP_DIAGNOSTIC,
    275            RUMP_KTRACE, RUMP_LOCKDEBUG, RUMP_LOCKS_UP, RUMP_NBCOMPAT,
    276            RUMP_VIRTIF, RUMP_VNODE_LOCKDEBUG, TOOLCHAIN_MISSING, TOOLDIR,
    277            USETOOLS, USE_FORT, USE_HESIOD, USE_INET6, USE_JEMALLOC,
    278            USE_KERBEROS, USE_LDAP, USE_LIBCSANITIZER, USE_PAM, USE_PIGZGZIP,
    279            USE_SANITIZER, USE_SKEY, USE_SSP, USE_XZ_SETS, USE_YP,
    280            X11MOTIFPATH, X11SRCDIR.
    281 
    282      The obsolete mk.conf(5) make variables are:
    283 
    284            EXTSRCSRCDIR, MKBFD, MKCRYPTO, MKEXTSRC, MKKDEBUG, MKKERBEROS4,
    285            MKLLD, MKLLDB, MKMCLINKER, MKPERFUSE, MKTOOLSDEBUG, NBUILDJOBS,
    286            SHAREDSTRINGS, USE_COMBINE, USE_NEW_TOOLCHAIN.
    287 
    288 BUILDING
    289    make command line options
    290      This is not a summary of all the options available to make(1); only the
    291      options used most frequently with NetBSD builds are listed here.
    292 
    293      -j njob    Run up to njob make(1) subjobs in parallel.  Makefiles should
    294                 use .WAIT or have explicit dependencies as necessary to
    295                 enforce build ordering.
    296 
    297      -m dir     Specify the default directory for searching for system
    298                 Makefile segments, mainly the <bsd.*.mk> files.  When building
    299                 any full NetBSD source tree, this should be set to the
    300                 "share/mk" directory in the source tree.  This is set
    301                 automatically when building from the top level, or when using
    302                 build.sh.
    303 
    304      -n         Show the commands that would have been executed, but do not
    305                 actually execute them.  This will still cause recursion to
    306                 take place.
    307 
    308      -V var     Show make(1)'s idea of the value of var.  Does not build any
    309                 targets.
    310 
    311      var=value  Set the variable var to value, overriding any setting
    312                 specified by the process environment, the MAKECONF
    313                 configuration file, or the system Makefile segments.
    314 
    315    make targets
    316      These default targets may be built by running make(1) in any subtree of
    317      the NetBSD source code.  It is recommended that none of these be used
    318      from the top level Makefile; as a specific exception, "make obj" and
    319      "make cleandir" are useful in that context.
    320 
    321      all        Build programs, libraries, and preformatted documentation.
    322 
    323      clean      Remove program and library object code files.
    324 
    325      cleandir   Same as clean, but also remove preformatted documentation,
    326                 dependency files generated by "make depend", and any other
    327                 files known to be created at build time.
    328 
    329      depend     Create dependency files (.depend) containing more detailed
    330                 information about the dependencies of source code on header
    331                 files.  Allows programs to be recompiled automatically when a
    332                 dependency changes.
    333 
    334      dependall  Does a "make depend" immediately followed by a "make all".
    335                 This improves cache locality of the build since both passes
    336                 read the source files in their entirety.
    337 
    338      distclean  Synonym for cleandir.
    339 
    340      includes   Build and install system header files.  Typically needed
    341                 before any system libraries or programs can be built.
    342 
    343      install    Install programs, libraries, and documentation into DESTDIR.
    344                 Few files will be installed to DESTDIR/dev, DESTDIR/etc,
    345                 DESTDIR/root or DESTDIR/var in order to prevent user supplied
    346                 configuration data from being overwritten.
    347 
    348      lint       Run lint(1) against the C source code, where appropriate, and
    349                 generate system-installed lint libraries.
    350 
    351      obj        Create object directories to be used for built files, instead
    352                 of building directly in the source tree.
    353 
    354      tags       Create ctags(1) searchable function lists usable by the ex(1)
    355                 and vi(1) text editors.
    356 
    357    make targets for the top level
    358      Additional make(1) targets are usable specifically from the top source
    359      level to facilitate building the entire NetBSD source tree.
    360 
    361      build         Build the entire NetBSD system (except the kernel).  This
    362                    orders portions of the source tree such that prerequisites
    363                    will be built in the proper order.
    364 
    365      distribution  Do a "make build", and then install a full distribution
    366                    (which does not include a kernel) into DESTDIR, including
    367                    files in DESTDIR/dev, DESTDIR/etc, DESTDIR/root and
    368                    DESTDIR/var.
    369 
    370      buildworld    As per "make distribution", except that it ensures that
    371                    DESTDIR is not the root directory.
    372 
    373      installworld  Install the distribution from DESTDIR to INSTALLWORLDDIR,
    374                    which defaults to the root directory.  Ensures that
    375                    INSTALLWORLDDIR is not the root directory if cross
    376                    compiling.
    377 
    378                    The INSTALLSETS environment variable may be set to a space-
    379                    separated list of distribution sets to be installed.  By
    380                    default, all sets except "etc" and "xetc" are installed, so
    381                    most files in INSTALLWORLDDIR/etc will not be installed or
    382                    modified.
    383 
    384                    Note: Before performing this operation with
    385                    INSTALLWORLDDIR=/, it is highly recommended that you
    386                    upgrade your kernel and reboot.  After performing this
    387                    operation, it is recommended that you use etcupdate(8) to
    388                    update files in INSTALLWORLDDIR/etc, and postinstall(8) to
    389                    check for or fix inconsistencies.
    390 
    391      sets          Create distribution sets from DESTDIR into
    392                    RELEASEDIR/RELEASEMACHINEDIR/binary/sets.  Should be run
    393                    after "make distribution", as "make build" alone does not
    394                    install all of the required files.
    395 
    396      sourcesets    Create source sets of the source tree into
    397                    RELEASEDIR/source/sets.
    398 
    399      syspkgs       Create syspkgs from DESTDIR into
    400                    RELEASEDIR/RELEASEMACHINEDIR/binary/syspkgs.  Should be run
    401                    after "make distribution", as "make build" alone does not
    402                    install all of the required files.
    403 
    404      release       Do a "make distribution", build kernels, distribution
    405                    media, and install sets (this as per "make sets"), and then
    406                    package the system into a standard release layout as
    407                    described by release(7).  This requires that RELEASEDIR be
    408                    set (see above).
    409 
    410      iso-image     Create a NetBSD installation CD-ROM image in the
    411                    RELEASEDIR/images directory.  The CD-ROM file system will
    412                    have a layout as described in release(7).
    413 
    414                    For most machine types, the CD-ROM will be bootable, and
    415                    will automatically run the sysinst(8) menu-based
    416                    installation program, which can be used to install or
    417                    upgrade a NetBSD system.  Bootable CD-ROMs also contain
    418                    tools that may be useful in repairing a damaged NetBSD
    419                    installation.
    420 
    421                    Before "make iso-image" is attempted, RELEASEDIR must be
    422                    populated by "make release" or equivalent.
    423 
    424                    Note: Other, smaller, CD-ROM images may be created in the
    425                    RELEASEDIR/RELEASEMACHINEDIR/installation/cdrom directory
    426                    by "make release".  These smaller images usually contain
    427                    the same tools as the larger images in RELEASEDIR/images,
    428                    but do not contain additional content such as the
    429                    distribution sets.
    430 
    431                    Note: The mac68k port still uses an older method of
    432                    creating CD-ROM images.  This requires the mkisofs(1)
    433                    utility, which is not part of NetBSD, but which can be
    434                    installed from pkgsrc/sysutils/cdrtools.
    435 
    436      iso-image-source
    437                    Create a NetBSD installation CD-ROM image in the
    438                    RELEASEDIR/images directory.  The CD-ROM file system will
    439                    have a layout as described in release(7).  It will have top
    440                    level directories for the machine type and source.
    441 
    442                    For most machine types, the CD-ROM will be bootable, and
    443                    will automatically run the sysinst(8) menu-based
    444                    installation program, which can be used to install or
    445                    upgrade a NetBSD system.  Bootable CD-ROMs also contain
    446                    tools that may be useful in repairing a damaged NetBSD
    447                    installation.
    448 
    449                    Before "make iso-image-source" is attempted, RELEASEDIR
    450                    must be populated by "make sourcesets release" or
    451                    equivalent.
    452 
    453                    Note: Other, smaller, CD-ROM images may be created in the
    454                    RELEASEDIR/RELEASEMACHINEDIR/installation/cdrom directory
    455                    by "make release".  These smaller images usually contain
    456                    the same tools as the larger images in RELEASEDIR/images,
    457                    but do not contain additional content such as the
    458                    distribution sets.
    459 
    460                    Note: The mac68k port still uses an older method of
    461                    creating CD-ROM images.  This requires the mkisofs(1)
    462                    utility, which is not part of NetBSD, but which can be
    463                    installed from pkgsrc/sysutils/cdrtools.
    464 
    465      install-image
    466                    Create a bootable NetBSD installation disk image in the
    467                    RELEASEDIR/images directory.  The installation disk image
    468                    is suitable for copying to bootable USB flash memory
    469                    sticks, etc., for machines which are able to boot from such
    470                    devices.  The file system in the bootable disk image will
    471                    have a layout as described in release(7).
    472 
    473                    The installation image is bootable, and will automatically
    474                    run the sysinst(8) menu-based installation program, which
    475                    can be used to install or upgrade a NetBSD system.  The
    476                    image also contains tools that may be useful in repairing a
    477                    damaged NetBSD installation.
    478 
    479                    Before "make install-image" is attempted, RELEASEDIR must
    480                    be populated by "make release" or equivalent.  The build
    481                    must have been performed with MKUNPRIVED=yes because "make
    482                    install-image" relies on information in DESTDIR/METALOG.
    483 
    484      live-image    Create NetBSD live images in the RELEASEDIR/images
    485                    directory.  The live image contains all necessary files to
    486                    boot NetBSD up to multi-user mode, including all files
    487                    which should be extracted during installation, NetBSD
    488                    disklabel, bootloaders, etc.
    489 
    490                    The live image is suitable for use as a disk image in
    491                    virtual machine environments such as QEMU, and also useful
    492                    to boot NetBSD from a USB flash memory stick on a real
    493                    machine, without the need for installation.
    494 
    495                    Before "make live-image" is attempted, RELEASEDIR must be
    496                    populated by "make release" or equivalent.  The build must
    497                    have been performed with MKUNPRIVED=yes because "make
    498                    install-image" relies on information in DESTDIR/METALOG.
    499 
    500      regression-tests
    501                    Can only be run after building the regression tests in the
    502                    directory "regress".  Runs those compiled regression tests
    503                    on the local host.
    504 
    505                    Note: Most tests are now managed instead using atf(7); this
    506                    target should probably run those as well but currently does
    507                    not.
    508 
    509    The build.sh script
    510      This script file is a shell script designed to build the entire NetBSD
    511      system on any host with a suitable modern shell and some common
    512      utilities.  The required shell features are described under the HOST_SH
    513      variable.
    514 
    515      If a host system's default shell does support the required features, then
    516      we suggest that you explicitly specify a suitable shell using a command
    517      like
    518 
    519            /path/to/suitable/shell build.sh [options]
    520 
    521      The above command will usually enable build.sh to automatically set
    522      HOST_SH=/path/to/suitable/shell, but if that fails, then the following
    523      set of commands may be used instead:
    524 
    525            HOST_SH=/path/to/suitable/shell
    526            export HOST_SH
    527            ${HOST_SH} build.sh [options]
    528 
    529      If build.sh detects that it is being executed under an unsuitable shell,
    530      it attempts to exec a suitable shell instead, or shows an error message.
    531      If HOST_SH is not set explicitly, then build.sh sets a default using
    532      heuristics dependent on the host platform, or from the shell under which
    533      build.sh is executed (if that can be determined), or using the first copy
    534      of sh found in PATH.
    535 
    536      All cross-compile builds, and most native builds, of the entire system
    537      should make use of build.sh rather than just running "make".  This way,
    538      the make(1) program will be bootstrapped properly, in case the host
    539      system has an older or incompatible "make" program.
    540 
    541      When compiling the entire system via build.sh, many make(1) variables are
    542      set for you in order to help encapsulate the build process.  In the list
    543      of options below, variables that are automatically set by build.sh are
    544      noted where applicable.
    545 
    546      The following operations are supported by build.sh:
    547 
    548      build         Build the system as per "make build".  Before the main part
    549                    of the build commences, this command runs the obj operation
    550                    (unless the -o option is given), "make cleandir" (unless
    551                    the -u option is given), and the tools operation.
    552 
    553      distribution  Build a full distribution as per "make distribution".  This
    554                    command first runs the build operation.
    555 
    556      release       Build a full release as per "make release".  This command
    557                    first runs the distribution operation.
    558 
    559      help          Show a help message, and exit.
    560 
    561      makewrapper   Create the nbmake-MACHINE wrapper script.  This operation
    562                    is automatically performed for any of the other operations.
    563 
    564      cleandir      Perform "make cleandir".
    565 
    566      obj           Perform "make obj".
    567 
    568      tools         Build and install the host tools from src/tools.  This
    569                    command will first run "make obj" and "make cleandir" in
    570                    the tools subdirectory unless the -o or -u options
    571                    (respectively) are given.
    572 
    573      install=idir  Install the contents of DESTDIR to idir, using "make
    574                    installworld".
    575 
    576                    Note: Files that are part of the "etc" or "xetc" sets will
    577                    not be installed, unless overridden by the INSTALLSETS
    578                    environment variable.
    579 
    580      kernel=kconf  Build a new kernel.  The kconf argument is the name of a
    581                    configuration file suitable for use by config(1).  If kconf
    582                    does not contain any `/' characters, the configuration file
    583                    is expected to be found in the KERNCONFDIR directory, which
    584                    is typically sys/arch/MACHINE/conf.  The new kernel will be
    585                    built in a subdirectory of KERNOBJDIR, which is typically
    586                    sys/arch/MACHINE/compile or an associated object directory.
    587 
    588                    This command does not imply the tools command; run the
    589                    tools command first unless it is certain that the tools
    590                    already exist and are up to date.
    591 
    592                    This command will run "make cleandir" on the kernel in
    593                    question first unless the -u option is given.
    594 
    595      kernel.gdb=kconf
    596                    Build a new kernel with debug information.  Similar to the
    597                    above kernel=kconf operation, but creates a netbsd.gdb file
    598                    alongside of the kernel netbsd, which contains a full
    599                    symbol table and can be used for debugging (for example
    600                    with a cross-gdb built by MKCROSSGDB).
    601 
    602      kernels       This command will build all kernels defined in port
    603                    specific release build procedure.
    604 
    605                    This command internally calls the kernel=kconf operation
    606                    for each found kernel configuration file.
    607 
    608      modules       This command will build kernel modules and install them
    609                    into DESTDIR.
    610 
    611      releasekernel=kconf
    612                    Install a gzip(1)ed copy of the kernel previously built by
    613                    kernel=kconf into
    614                    RELEASEDIR/RELEASEMACHINEDIR/binary/kernel, usually as
    615                    netbsd-kconf.gz, although the "netbsd" prefix is determined
    616                    from the "config" directives in kconf.
    617 
    618      sets          Perform "make sets".
    619 
    620      sourcesets    Perform "make sourcesets".
    621 
    622      syspkgs       Perform "make syspkgs".
    623 
    624      iso-image     Perform "make iso-image".
    625 
    626      iso-image-source
    627                    Perform "make iso-image-source".
    628 
    629      install-image
    630                    Perform "make install-image".
    631 
    632      live-image    Perform "make live-image".
    633 
    634      list-arch     Show a list of valid MACHINE and MACHINE_ARCH settings, the
    635                    default MACHINE_ARCH for each MACHINE, and aliases for
    636                    MACHINE/MACHINE_ARCH pairs, and then exits.  The -m or -a
    637                    options (or both) may be used to specify glob patterns that
    638                    will be used to narrow the list of results; for example,
    639                    "build.sh -m 'evb*' -a '*arm*' list-arch" will list all
    640                    known MACHINE/MACHINE_ARCH values in which either MACHINE
    641                    or ALIAS matches the pattern `evb*', and MACHINE_ARCH
    642                    matches the pattern `*arm*'.
    643 
    644      The following command line options alter the behaviour of the build.sh
    645      operations described above:
    646 
    647      -a arch   Set the value of MACHINE_ARCH to arch.  See the -m option for
    648                more information.
    649 
    650      -B buildid
    651                Set the value of BUILDID to buildid.  This will also append the
    652                build identifier to the name of the nbmake-MACHINE wrapper
    653                script so that the resulting name is of the form
    654                "nbmake-MACHINE-BUILDID".
    655 
    656      -C cdextras
    657                Append cdextras to the CDEXTRA variable, which is a space-
    658                separated list of files or directories that will be added to
    659                the CD-ROM image that may be create by the "iso-image" or
    660                "iso-image-source" operations.  Files will be added to the root
    661                of the CD-ROM image, whereas directories will be copied
    662                recursively.  If relative paths are specified, they will be
    663                converted to absolute paths before being used.  Multiple paths
    664                may be specified via multiple -C options, or via a single
    665                option whose argument contains multiple space-separated paths.
    666 
    667      -c compiler
    668                Select the compiler for the toolchain to build NetBSD and for
    669                inclusion in the NetBSD distribution.  Supported choices:
    670 
    671                      clang
    672 
    673                      gcc [default]
    674 
    675                The compiler used to build the toolchain can be different; see
    676                HOST_CC and HOST_CXX.
    677 
    678      -D dest   Set the value of DESTDIR to dest.  If a relative path is
    679                specified, it will be converted to an absolute path before
    680                being used.
    681 
    682      -E        Set `expert' mode.  This overrides various sanity checks, and
    683                allows: DESTDIR does not have to be set to a non-root path for
    684                builds, and MKUNPRIVED=yes does not have to be set when
    685                building as a non-root user.
    686 
    687                Note: It is highly recommended that you know what you are doing
    688                when you use this option.
    689 
    690      -h        Show a help message, and exit.
    691 
    692      -j njob   Run up to njob make(1) subjobs in parallel; passed through to
    693                make(1).  If you see failures for reasons other than running
    694                out of memory while using build.sh with -j, please save
    695                complete build logs so the failures can be analyzed.
    696 
    697                To achieve the fastest builds, -j values between (1 + the
    698                number of CPUs) and (2 * the number of CPUs) are recommended.
    699                Use lower values on machines with limited memory or I/O
    700                bandwidth.
    701 
    702      -M obj    Set MAKEOBJDIRPREFIX to obj.  Unsets MAKEOBJDIR.  See "-O obj"
    703                for more information.
    704 
    705                For instance, if the source directory is /usr/src, a setting of
    706                "-M /usr/obj" will place build-time files under
    707                /usr/obj/usr/src/bin, /usr/obj/usr/src/lib,
    708                /usr/obj/usr/src/usr.bin, and so forth.
    709 
    710                If a relative path is specified, it will be converted to an
    711                absolute path before being used.  build.sh imposes the
    712                restriction that the argument to the -M option must not begin
    713                with a "$" (dollar sign) character; otherwise it would be too
    714                difficult to determine whether the value is an absolute or a
    715                relative path.  If the directory does not already exist,
    716                build.sh will create it.
    717 
    718      -m mach   Set the value of MACHINE to mach, unless the mach argument is
    719                an alias that refers to a MACHINE/MACHINE_ARCH pair, in which
    720                case both MACHINE and MACHINE_ARCH are set from the alias.
    721                Such aliases are interpreted entirely by build.sh; they are not
    722                used by any other part of the build system.  The MACHINE_ARCH
    723                setting implied by mach will override any value of MACHINE_ARCH
    724                in the process environment, but will not override a value set
    725                by the -a option.  All cross builds require -m, but if unset on
    726                a NetBSD host, the host's value of MACHINE will be detected and
    727                used automatically.
    728 
    729                See the list-arch operation for a way to get a list of valid
    730                MACHINE and MACHINE_ARCH settings.
    731 
    732      -N noiselevel
    733                Set the "noisiness" level of the build, by setting MAKEVERBOSE
    734                to noiselevel.
    735 
    736      -n        Show the commands that would be executed by build.sh, but do
    737                not make any changes.  This is similar in concept to "make -n".
    738 
    739      -O obj    Create an appropriate transform macro for MAKEOBJDIR that will
    740                place the built object files under obj.  Unsets
    741                MAKEOBJDIRPREFIX.
    742 
    743                For instance, a setting of "-O /usr/obj" will place build-time
    744                files under /usr/obj/bin, /usr/obj/lib, /usr/obj/usr.bin, and
    745                so forth.
    746 
    747                If a relative path is specified, it will be converted to an
    748                absolute path before being used.  build.sh imposes the
    749                restriction that the argument to the -O option must not contain
    750                a "$" (dollar sign) character.  If the directory does not
    751                already exist, build.sh will create it.
    752 
    753                In normal use, exactly one of the -M or -O options should be
    754                specified.  If neither -M nor -O is specified, then a default
    755                object directory will be chosen according to rules in
    756                <bsd.obj.mk>.  Relying on this default is not recommended
    757                because it is determined by complex rules that are influenced
    758                by the values of several variables and by the location of the
    759                source directory.
    760 
    761                Note: Placing the obj directory location outside of the default
    762                source tree hierarchy makes it easier to manually clear out old
    763                files in the event the "make cleandir" operation is unable to
    764                do so.  (See CAVEATS below.)
    765 
    766                Note: The use of one of -M or -O is the only means of building
    767                multiple machine architecture userlands from the same source
    768                tree without cleaning between builds (in which case, one would
    769                specify distinct obj locations for each).
    770 
    771      -o        Set the value of MKOBJDIRS to "no".  Otherwise, it will be
    772                automatically set to "yes".  This default is opposite to the
    773                behaviour when not using build.sh.
    774 
    775      -P        Set the value of MKREPRO and MKREPRO_TIMESTAMP to the latest
    776                source CVS timestamp for reproducible builds.
    777 
    778      -R rel    Set the value of RELEASEDIR to rel.  If a relative path is
    779                specified, it will be converted to an absolute path before
    780                being used.
    781 
    782      -r        Remove the contents of DESTDIR and TOOLDIR before building
    783                (provides a clean starting point).  This will skip deleting
    784                DESTDIR if building on a native system to the root directory.
    785 
    786      -S seed   Change the value of BUILDSEED to seed.  This should rarely be
    787                necessary.
    788 
    789      -T tools  Set the value of TOOLDIR to tools.  If a relative path is
    790                specified, it will be converted to an absolute path before
    791                being used.  If set, the bootstrap "make" will only be rebuilt
    792                if the source files for make(1) have changed.
    793 
    794      -U        Set MKUNPRIVED=yes.
    795 
    796      -u        Set MKUPDATE=yes.
    797 
    798      -V var=[value]
    799                Set the environment variable var to an optional value.  This is
    800                propagated to the nbmake-MACHINE wrapper script.
    801 
    802      -w wrapper
    803                Create the nbmake-MACHINE wrapper script (see below) in a
    804                custom location, specified by wrapper.  This allows, for
    805                instance, to place the wrapper script in PATH automatically.
    806 
    807                Note: wrapper is the full name of the file, not just a
    808                directory name.  If a relative path is specified, it will be
    809                converted to an absolute path before being used.
    810 
    811      -X x11src
    812                Set the value of X11SRCDIR to x11src.  If a relative path is
    813                specified, it will be converted to an absolute path before
    814                being used.
    815 
    816      -x        Set MKX11=yes.
    817 
    818      -Z var    Unset ("zap") the environment variable var.  This is propagated
    819                to the nbmake-MACHINE wrapper script.
    820 
    821      -?        Show a help message, and exit.
    822 
    823    The nbmake-MACHINE wrapper script
    824      If using the build.sh script to build NetBSD, a nbmake-MACHINE wrapper
    825      script will be created in TOOLDIR/bin upon the first build to assist in
    826      building subtrees on a cross-compile host.
    827 
    828      The nbmake-MACHINE wrapper script can be invoked in lieu of make(1), and
    829      will instead call the up-to-date version of "nbmake" installed into
    830      TOOLDIR/bin with several key variables pre-set, including MACHINE,
    831      MACHINE_ARCH, and TOOLDIR.  nbmake-MACHINE will also set variables
    832      specified with -V, and unset variables specified with -Z.  Note that by
    833      default these variables will not override mk.conf(5); see make variables
    834      for more details.
    835 
    836      This wrapper script can be symlinked into a directory listed in PATH, or
    837      called with an absolute path.
    838 
    839 EXAMPLES
    840      1.   % ./build.sh [OPTIONS] tools kernel=GENERIC
    841 
    842           Build a new toolchain, and use the new toolchain to configure and
    843           build a new GENERIC kernel.
    844 
    845      2.   % ./build.sh [OPTIONS] -U distribution
    846 
    847           Using unprivileged mode, build a complete distribution to a DESTDIR
    848           directory that build.sh selects (and will show).
    849 
    850      3.   # ./build.sh [OPTIONS] -U install=/
    851 
    852           As root, install to / the distribution that was built by example 2.
    853           Even though this is run as root, -U is required so that the
    854           permissions stored in DESTDIR/METALOG are correctly applied to the
    855           files as they're copied to /.
    856 
    857      4.   % ./build.sh [OPTIONS] -U -u release
    858 
    859           Using unprivileged mode, build a complete release to DESTDIR and
    860           RELEASEDIR directories that build.sh selects (and will show).
    861           MKUPDATE=yes (-u) is set to prevent the "make cleandir", so that if
    862           this is run after example 2, it doesn't need to redo that portion of
    863           the release build.
    864 
    865 SEE ALSO
    866      config(1), ctags(1), ex(1), gzip(1), lint(1), make(1), mandoc(1),
    867      mkisofs(1), nroff(1), vi(1), mk.conf(5), atf(7), hier(7), mdoc(7),
    868      release(7), etcupdate(8), installboot(8), mount(8), postinstall(8),
    869      sysinst(8), pkgsrc/sysutils/cdrtools
    870 
    871      Note: The NetBSD manual pages are also available at
    872      https://man.netbsd.org
    873 
    874 HISTORY
    875      The build.sh based build scheme was introduced for NetBSD 1.6 as
    876      USE_NEW_TOOLCHAIN, and re-worked to TOOLCHAIN_MISSING after that.
    877 
    878 CAVEATS
    879      After significant updates to third-party components in the source tree,
    880      the "make cleandir" operation may be insufficient to clean out old files
    881      in object directories.  Instead, one may have to manually remove the
    882      files.  Consult the UPDATING file for notices concerning this.
    883 
    884 NetBSD                         November 28, 2025                        NetBSD
    885