1.\" 2.\" Copyright (c) 2019 The DragonFly Project. All rights reserved. 3.\" 4.\" This code is derived from software contributed to The DragonFly Project 5.\" by Matthew Dillon <dillon@backplane.com> 6.\" This code is based on a concept originally developed by John R. Marino. 7.\" 8.\" Redistribution and use in source and binary forms, with or without 9.\" modification, are permitted provided that the following conditions 10.\" are met: 11.\" 12.\" 1. Redistributions of source code must retain the above copyright 13.\" notice, this list of conditions and the following disclaimer. 14.\" 2. Redistributions in binary form must reproduce the above copyright 15.\" notice, this list of conditions and the following disclaimer in 16.\" the documentation and/or other materials provided with the 17.\" distribution. 18.\" 3. Neither the name of The DragonFly Project nor the names of its 19.\" contributors may be used to endorse or promote products derived 20.\" from this software without specific, prior written permission. 21.\" 22.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 28.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 30.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 31.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 32.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33.\" SUCH DAMAGE. 34.\" 35.Dd October 24, 2019 36.Dt DSYNTH 1 37.Os 38.Sh NAME 39.Nm dsynth 40.Nd dsynth bulk dports builder utility 41.Sh SYNOPSIS 42.Nm 43.Op Fl dhvyDS 44.Op Fl p Ar profile 45.Op Fl s Ar n 46.Op Fl m Ar gb 47.Ar directive 48.Op origins 49.Nm 50.Ar help 51.Sh DESCRIPTION 52The 53.Nm 54utility allows a user to build and maintain part or all of dports 55locally. 56.Nm 57figures out the dependency topology of the dport(s) for you and 58is capable of building any number of ports concurrently based 59on the configuration parameters you supply. 60.Pp 61.Nm 62is based on an application called 63.Xr synth 1 64which was written by John Marino in Ada and served as the conceptual base 65for this program. 66.Nm 67is written in C and designed to be as portable as possible given a 68ports-style infrastructure. 69.Pp 70Our recommended build topology is with a configuration as follows: 71.Bd -literal 72[Global Configuration] 73profile_selected= LiveSystem 74 75[LiveSystem] 76Operating_system= DragonFly 77Directory_packages= /build/synth/live_packages 78Directory_repository= /build/synth/live_packages/All 79Directory_portsdir= /build/synth/dports 80Directory_options= /build/synth/options 81Directory_distfiles= /build/synth/distfiles 82Directory_buildbase= /build/synth/build 83Directory_logs= /build/synth/logs 84Directory_ccache= disabled 85Directory_system= / 86Package_suffix= .txz 87Number_of_builders= 8 88Max_jobs_per_builder= 8 89Display_with_ncurses= true 90.Ed 91.Pp 92This places all major directories under 93.Pa /build/synth . 94If you want to use the same dports and the same distfiles as your base 95system, you can null-mount /usr/distfiles onto /build/synth/distfiles 96and /usr/dports onto /build/synth/dports with 97.Pa /etc/fstab 98entries as follows: 99.Bd -literal 100# Device Mountpoint FStype Options DumpPass# 101/usr/distfiles /build/synth/distfiles null rw 4 4 102/usr/dports /build/synth/dports null rw 4 4 103.Ed 104.Pp 105Please set the number of builders and the maximum number of jobs per 106builder according to available system resources. 107Remember that the total 108load on the system can be as high as (builders x jobs), and at least 4x 109that value in processes. 110Systems are typically restricted by memory and CPU horsepower. 111Start conservative and ramp up according to what your system can handle. 112A good rule of thumb is to set workers to the number of CPU threads your 113machine has or to 1/2 the number of gigabytes of memory your system has, 114whichever is lower. 115Then set the jobs per worker to no more than the 116number of CPU threads your machine has. 117.Pp 118.Nm 119has numerous features to manage machine load and swap usage to 120prevent a machine from being overloaded, allowing more workers 121to be configured than you might otherwise think is reasonable 122(which helps a lot when building the smaller ports). 123However, users running this program should be aware that very high loads 124and modest swap use are still likely to develop when building a large 125number of ports or when building very large ports like chromium. 126If the system is not dedicated to building packages you can reduce the 127impact to the rest of the system by running 128.Nm 129at nice +20 and also by reducing the number of workers and number of 130jobs per worker somewhat. 131.Pp 132We recommend that a minimum of 64GB of SSD-based swap be configured, 133or twice as much swap as main memory, whichever is the higher value. 134.Pp 135We recommend a minimum of 500GB of storage be configured in 136.Pa /build 137or wherever you have configured various directories. 138A full set of distfiles requires at least 120GB, a full dports including 139the git repo requires at least 1.5GB, and a full set of built packages 140requires at least 75GB. 141If using a filesystem such as HAMMER or HAMMER2 142which frees space overnight, double all of those numbers. 143.Pp 144The actual build infrastructure uses tmpfs... memory and swap, and does 145not use regular filesystem space. 146.Sh OPTIONS 147.Bl -tag -width indent 148.It Fl d[d...] 149Run in debug mode. 150If specified two or more times this will turn off 151ncurses and output the primary log (00_last_results.log) to the standard 152output, along with additional spew. 153.It Fl h 154Quickly output a synopsis of options and directives and exit. 155.It Fl m Ar gb 156Override the default package dependency memory target, in gigabytes. 157The default is 1/2 physical memory. 158The number of workers will be limited 159such that the aggregate size of package dependencies installed in each 160worker slot does not exceed this value. 161.Pp 162This handles a well-known effect where the sheer amount of data that has 163to be installed in tmpfs filesystems for large ports, when multiplied by 164the number of worker slots, can force excessive paging to occur and leave 165preciously little memory available to actually run compiles. 166Some paging 167is necessary to maintain maximum CPU utilization, but excessive paging 168can cause the whole machine to essentially become idle for extended 169periods of time. 170.It Fl v 171Quickly output the version and exit. 172.It Fl y 173Automatically answer 'y'es to any questions. 174.It Fl p Ar profile 175Override the global profile default in 176.Pa /etc/dsynth/dsynth.ini , 177allowing you to trivially run whatever profile you like without having to 178edit the configuration file when switching. 179In addition, you can now run any number of dsynth's concurrently on the same 180machine without having to use a jail, each with a different profile, 181as long as the packages, repository, buildbase, and logs directories 182are different. 183.Pp 184Note that the distfiles directory can be shared and will not conflict 185or get confused with concurrent fetches. 186.It Fl s Ar n 187.Nm 188usually slow-starts the worker slots, beginning with one slot and increasing 189by one every 5 seconds until the maximum configured number of workers is 190reached. 191This gives 192.Nm 193a slower ramp that it can load manage against. 194Specifying 0 disables the slow-start feature and the maximum number of 195worker slots (limited by the dependency graph) will be loaded immediately. 196.It Fl D 197Turn on DEVELOPER mode when building ports. 198.It Fl S[S] 199Turn off curses for script friendliness. 200The output will be log 00 and 201should be redirected to /dev/null or something similar. 202If you supply the options twice, color output escapes will also be 203turned off. 204You may also wish to use the 205.Fl y 206option for scripting dsynth. 207.El 208.Sh DIRECTIVES 209Generally 210.Nm 211is run with a directive and some directives allow a list of ports to be 212specified. 213This list should be space-delimited in DIR/SUBDIR format, for example: 214.Ar www/chromium . 215For directives with an optional ports list, your current installed set 216of ports will be used if you do not specify a list. 217.Bl -tag -width indent 218.It Cm status 219This will do a dry-run of 220.Cm upgrade-system 221but not actually build anything. 222.It Cm cleanup 223This will clean up any left-over mounts from prior builds. 224.Nm 225attempts to clean up all processes and mounts when you interrupt 226a build but doesn't always succeed. 227.It Cm init 228Creates and initializes the 229.Pa /etc/dsynth 230directory if it does not exst. 231This directive will complain and exit if either 232.Pa /etc/dsynth 233or 234.Pa /usr/local/etc/dsynth 235exists. 236It will not create 237.Pa /etc/dsynth 238in this situation. 239.It Cm configure 240NOT CURRENTLY IMPLEMENTED 241.It Cm upgrade-system 242NOT CURRENTLY IMPLEMENTED. 243Incrementally build and upgrade your locally 244installed packages, then upgrade your local system with them. 245.It Cm prepare-system 246Incrementally build and upgrade your locally installed packages, but 247do not upgrade your system with them. 248.It Cm rebuild-repository 249Build or rebuild the database files for the configured repository. 250.It Cm purge-distfiles 251Delete any obsolete source distribution files. 252.It Cm status-everything 253This will do a dry-run of a full bulk build of everything, 254but not actually build anything. 255.It Cm everything 256This will build the entire dports tree and then rebuild the repository 257when it finishes. 258.It Cm version 259This is for synth compatibility. 260The version of 261.Nm 262will be printed and the program will exit. 263.It Cm help 264Output a synopsis of options and directives and exit. 265.It Cm status Op Ar ports 266Do a dry-run with 'build' of the given list. 267.It Cm build Op Ar ports 268Incrementally build dports based on the given list. 269When done, ask whether the repository should be rebuilt or not. 270.It Cm just-build Op Ar ports 271Incrementally build dports based on the given list, then 272exits. 273No post-build steps will be taken. 274.It Cm install Op Ar ports 275NOT CURRENTLY IMPLEMENTED. 'build' based on the supplied 276list (or using currently installed packages), then rebuild 277the repository and upgrade the system without asking any further 278questions. 279.It Cm force Op Ar ports 280This is the same as 'build' but will delete existing packages first. 281Dependencies are not deleted unless they are out of date. 282.It Cm test Op Ar ports 283This is the same as 'build' but sets the environment variable 284.Ev DEVELOPER 285to 286.Sq yes 287and pre-deletes specified packages. 288Dependencies are not deleted unless they are out of date. 289.El 290.Sh FILES 291.Bl -tag -width ".It Pa <fs>/abc/defghi/<name>" -compact 292.It Pa /etc/dsynth/dsynth.ini 293The primary configuration file. 294If not found, 295.Nm 296will also look in 297.Pa /usr/local/etc/dsynth/dsynth.ini . 298.Pp 299.It Pa /etc/dsynth/LiveSystem-make.conf 300Typically contains the environment variables that will be set in 301the workers. 302.Nm 303firewalls the environment it is run under from the environment it 304provides to the workers. 305.Pp 306.It Pa /build/synth/build 307Recommended setting for 308.Va Directory_buildbase , 309contains the build infrastructure... typically a template, mirrored 310system directories, and mount points for all the worker slots. 311The template will be [re]generated if 'pkg' needs to be built or 312if the 313.Pa .template.good 314file in this directory is deleted. 315.Pp 316.It Pa /build/synth/distfiles 317Recommended setting for 318.Va Directory_distfiles , 319ports to a directory into which 320.Nm 321will download any source distribution files required for building. 322.Pp 323.It Pa /build/synth/dports 324Recommended setting for 325.Va Directory_portsdir , 326points to a checked out dports repo. 327Note that 328.Nm 329does not automatically 'git pull' or otherwise synchronize the dports repo, 330you must do that yourself prior to starting a build. 331.Pp 332.It Pa /build/synth/live_packages 333Recommended setting for 334.Va Directory_packages , 335points to a directory which will contain the completed application 336packages. 337.Pp 338.It Pa /build/synth/logs 339Recommended setting for 340.Va Directory_logs , 341all log files will be placed in this directory. 342Special management logfiles begin with the numeral '0' for easily 343location. 344The logfiles for ports while and after building are stored in the 345form subdir____portname.log, with three underscores. 346.Pp 347.It Pa /build/synth/options 348Recommended setting for 349.Va Directory_options , 350where options overrides for specific ports may be located. 351.Pp 352.It Pa / 353Recommended setting for 354.Va Directory_system , 355which 356.Nm 357uses as a basis for creating the jails or chroots in each worker slot 358during building. 359No part of the system root is ever NULL-mounted read-write... it is always 360NULL-mounted read-only. 361Some elements from the system base will be mirrored in the build-base 362as an optimization. 363.Pp 364Note that the packages directory and the distfiles directory is mounted 365read-write in jails or chroots. 366All other r/w filesystems in the workers are 367.Xr tmpfs 5 368based filesystems and will be created and torn-down for each port. 369.Pp 370.It Pa .txz 371.It Pa .tgz 372.It Pa .tar 373.It Pa .tbz 374The recommended setting for 375.Va Package_suffix 376is either 377.Pa .txz 378or 379.Pa .tgz . 380Use 381.Pa .txz 382for better compression at the cost of somewhat slower bulk builds due 383to the time overhead for compression and decompression, or 384use 385.Pa .tgz 386for modest compression and very fast compression and decompression. 387Due to the way the builder works, package dependencies are fresly 388installed into the chroot slot for each package being built, so 389decompression time matters. 390.El 391.Sh EXIT STATUS 392.Ex -std 393.Sh SEE ALSO 394.Xr synth 1 , 395.Xr dports 7 396.Sh HISTORY 397The 398.Nm 399utility first appeared in 400.Dx 5.7 . 401.Sh AUTHORS 402.An Matthew Dillon Aq Mt dillon@backplane.com 403