The second part of the Makefile
      describes the files that must be downloaded to build
      the port, and where they can be downloaded.
DISTNAME is the name of the port as
	called by the authors of the software.
	DISTNAME defaults to
	${PORTNAME}-${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX},
	and if not set, DISTVERSION defaults to
	${PORTVERSION} so override
	DISTNAME
	only if necessary.  DISTNAME is only used
	in two places.  First, the distribution file list
	(DISTFILES) defaults to
	${DISTNAME}${EXTRACT_SUFX}.
	Second, the distribution file is expected to extract into a
	subdirectory named WRKSRC, which defaults
	to work/${DISTNAME}.
Some vendor's distribution names which do not fit into the
	${PORTNAME}-${PORTVERSION}-scheme can be
	handled automatically by setting
	DISTVERSIONPREFIX,
	DISTVERSION, and
	DISTVERSIONSUFFIX.
	PORTVERSION will be derived from
	DISTVERSION automatically.
Only one of PORTVERSION and
	  DISTVERSION can be set at a time.  If
	  DISTVERSION does not derive a correct
	  PORTVERSION, do not use
	  DISTVERSION.
If the upstream version scheme can be derived into a
	ports-compatible version scheme, set some variable to the
	upstream version, do not use
	DISTVERSION as the variable name.  Set
	PORTVERSION to the computed version based
	on the variable you
	created, and set DISTNAME
	accordingly.
If the upstream version scheme cannot easily be coerced
	into a ports-compatible value, set
	PORTVERSION to a sensible value, and set
	DISTNAME with PORTNAME
	with the verbatim upstream version.
PORTVERSION
	  ManuallyBIND9 uses a version scheme
	  that is not compatible with the ports versions (it has
	  - in its versions) and cannot be derived
	  using DISTVERSION because after the 9.9.9
	  release, it will release a “patchlevels” in the
	  form of 9.9.9-P1.  DISTVERSION would
	  translate that into 9.9.9.p1, which, in
	  the ports versioning scheme means 9.9.9 pre-release 1, which
	  is before 9.9.9 and not after.  So
	  PORTVERSION is manually derived from an
	  ISCVERSION variable to output
	  9.9.9p1.
The order into which the ports framework, and pkg, will
	  sort versions is checked using the -t
	  argument of pkg-version(8):
%pkg version -t 9.9.9 9.9.9.p1>![]()
%pkg version -t 9.9.9 9.9.9p1<
The   | |
The   | 
In the port Makefile, for example
	  dns/bind99, it is achieved
	  by:
PORTNAME=	bind
PORTVERSION=	${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/} 
CATEGORIES=	dns net
MASTER_SITES=	ISC/bind9/${ISCVERSION} 
PKGNAMESUFFIX=	99
DISTNAME=	${PORTNAME}-${ISCVERSION} 
MAINTAINER=	mat@FreeBSD.org
COMMENT=	BIND DNS suite with updated DNSSEC and DNS64
LICENSE=	ISCL
# ISC releases things like 9.8.0-P1 or 9.8.1rc1, which our versioning does not like
ISCVERSION=	9.9.9-P6 
DISTNAME from
	  PORTVERSIONFrom time to time, the distribution file name has little or no relation to the version of the software.
In comms/kermit, only the last element of the version is present in the distribution file:
PORTNAME=	kermit
PORTVERSION=	9.0.304
CATEGORIES=	comms ftp net
MASTER_SITES=	ftp://ftp.kermitproject.org/kermit/test/tar/
DISTNAME=	cku${PORTVERSION:E}-dev20 
The   | 
Sometimes, there is no relation between the software name, its version, and the distribution file it is distributed in.
From audio/libworkman:
PORTNAME=       libworkman
PORTVERSION=    1.4
CATEGORIES=     audio
MASTER_SITES=   LOCAL/jim
DISTNAME=       ${PORTNAME}-1999-06-20In comms/librs232, the
	  distribution file is not versioned, so using DIST_SUBDIR
	  is needed:
PORTNAME=       librs232
PORTVERSION=    20160710
CATEGORIES=     comms
MASTER_SITES=   http://www.teuniz.net/RS-232/
DISTNAME=       RS-232
DIST_SUBDIR=	${PORTNAME}-${PORTVERSION}PKGNAMEPREFIX and
	  PKGNAMESUFFIX do not affect
	  DISTNAME.  Also note that if
	  WRKSRC is equal to
	  ${WRKDIR}/${DISTNAME} while
	  the original source archive is named something other than
	  ${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX},
	  leave DISTNAME
	  alone— defining only
	  DISTFILES is easier than both
	  DISTNAME and WRKSRC
	  (and possibly EXTRACT_SUFX).
Record the directory part of the FTP/HTTP-URL pointing at
	the original tarball in MASTER_SITES.  Do
	not forget the trailing slash (/)!
The make macros will try to use this
	specification for grabbing the distribution file with
	FETCH if they cannot find it already on the
	system.
It is recommended that multiple sites are included on this list, preferably from different continents. This will safeguard against wide-area network problems.
MASTER_SITES must not be blank.  It
	  must point to the actual site hosting the distribution
	  files.  It cannot point to web archives, or the FreeBSD
	  distribution files cache sites.  The only exception to this
	  rule is ports that do not have any distribution files.  For
	  example, meta-ports do not have any distribution files, so
	  MASTER_SITES does not need to be
	  set.
Shortcut abbreviations are available for popular
	  archives like SourceForge (SOURCEFORGE),
	  GNU (GNU), or Perl CPAN
	  (PERL_CPAN).
	  MASTER_SITES can use them
	  directly:
MASTER_SITES= GNU/make
The older expanded format still works, but all ports have been converted to the compact format. The expanded format looks like this:
MASTER_SITES=		${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR=	makeThese values and variables are defined in Mk/bsd.sites.mk.
	  New entries are added often, so make sure to check the
	  latest version of this file before submitting a port.
For any
	    MASTER_SITE_
	    variable, the shorthand
	    FOO can be
	    used.  For example, use:FOO
MASTER_SITES=	FOOIf MASTER_SITE_SUBDIR is needed,
	    use this:
MASTER_SITES=FOO/bar
Several “magic” macros exist for
	  popular sites with a predictable directory structure.  For
	  these, just use the abbreviation and the system will choose
	  a subdirectory automatically.  For a port
	  named Stardict, of version
	  1.2.3, and hosted on SourceForge, adding
	  this line:
MASTER_SITES= SF
infers a subdirectory named
	  /project/stardict/stardict/1.2.3.  If the
	  inferred directory is incorrect, it can be
	  overridden:
MASTER_SITES=	SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}This can also be written as
MASTER_SITES=	SF
MASTER_SITE_SUBDIR=	stardict/WyabdcRealPeopleTTS/${PORTVERSION}MASTER_SITES
	    Macros| Macro | Assumed subdirectory | 
|---|---|
APACHE_COMMONS_BINARIES | ${PORTNAME:S,commons-,,} | 
APACHE_COMMONS_SOURCE | ${PORTNAME:S,commons-,,} | 
APACHE_JAKARTA | ${PORTNAME:S,-,/,}/source | 
BERLIOS | ${PORTNAME:tl}.berlios | 
CHEESESHOP | source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/} | 
CPAN | ${PORTNAME:C/-.*//} | 
DEBIAN | pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME} | 
FARSIGHT | ${PORTNAME} | 
FESTIVAL | ${PORTREVISION} | 
GCC | releases/${DISTNAME} | 
GENTOO | distfiles | 
GIMP | ${PORTNAME}/${PORTVERSION:R}/ | 
GH | ${GH_ACCOUNT}/${GH_PROJECT}/tar.gz/${GH_TAGNAME}?dummy=/ | 
GHC | ${GH_ACCOUNT}/${GH_PROJECT}/ | 
GNOME | sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/} | 
GNU | ${PORTNAME} | 
GNUPG | ${PORTNAME} | 
GNU_ALPHA | ${PORTNAME} | 
HORDE | ${PORTNAME} | 
LODEV | ${PORTNAME} | 
MATE | ${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/} | 
MOZDEV | ${PORTNAME:tl} | 
NL | ${PORTNAME} | 
QT | archive/qt/${PORTVERSION:R} | 
SAMBA | ${PORTNAME} | 
SAVANNAH | ${PORTNAME:tl} | 
SF | ${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION} | 
If the distribution file comes from a specific commit or
	tag on GitHub
	for which there is no officially released file, there is an
	easy way to set the right DISTNAME and
	MASTER_SITES automatically.  These
	variables are available:
USE_GITHUB Description| Variable | Description | Default | 
|---|---|---|
GH_ACCOUNT | Account name of the GitHub user hosting the project | ${PORTNAME} | 
GH_PROJECT | Name of the project on GitHub | ${PORTNAME} | 
GH_TAGNAME | Name of the tag to download (2.0.1, hash, ...) Using the name of a branch here is incorrect. It is also possible to use the hash of a commit id to do a snapshot. | ${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX} | 
GH_SUBDIR | When the software needs an additional
		distribution file to be extracted within
		${WRKSRC}, this variable can be
		used.  See the examples in Section 5.4.3.1, “Fetching Multiple Files from GitHub”
		for more information. | (none) | 
GH_TUPLE | GH_TUPLE allows putting
		GH_ACCOUNT,
		GH_PROJECT,
		GH_TAGNAME, and
		GH_SUBDIR into a single variable.
		The format is
		account:project:tagname:group/subdir.
		The
		/subdir
		part is optional.  It is helpful when there is more
		than one GitHub project from which to fetch. | 
Do not use GH_TUPLE for the default
	  distribution file, as it has no default.
USE_GITHUBWhile trying to make a port for version
	  1.2.7 of pkg
	  from the FreeBSD user on github, at https://github.com/freebsd/pkg, The
	  Makefile would end up looking like
	  this (slightly stripped for the example):
PORTNAME= pkg DISTVERSION= 1.2.7 USE_GITHUB= yes GH_ACCOUNT= freebsd
It will automatically have
	  MASTER_SITES set to GH
	    GHC and WRKSRC to
	  ${WRKDIR}/pkg-1.2.7.
USE_GITHUBWhile trying to make a port for the bleeding edge
	  version of pkg from the FreeBSD
	  user on github, at https://github.com/freebsd/pkg, the
	  Makefile ends up looking like
	  this (slightly stripped for the example):
PORTNAME= pkg-devel DISTVERSION= 1.3.0.a.20140411 USE_GITHUB= yes GH_ACCOUNT= freebsd GH_PROJECT= pkg GH_TAGNAME= 6dbb17b
It will automatically have
	  MASTER_SITES set to GH
	    GHC and WRKSRC to
	  ${WRKDIR}/pkg-6dbb17b.
20140411 is the date of the
	    commit referenced in GH_TAGNAME, not
	    the date the Makefile is edited, or
	    the date the commit is made.
USE_GITHUB with
	  DISTVERSIONPREFIXFrom time to time, GH_TAGNAME is a
	  slight variation from DISTVERSION.
	  For example, if the version is 1.0.2,
	  the tag is v1.0.2.  In those cases, it
	  is possible to use DISTVERSIONPREFIX or
	  DISTVERSIONSUFFIX:
PORTNAME= foo DISTVERSIONPREFIX= v DISTVERSION= 1.0.2 USE_GITHUB= yes
It will automatically set
	  GH_TAGNAME to
	  v1.0.2, while WRKSRC
	  will be kept to
	  ${WRKDIR}/foo-1.0.2.
USE_GITHUB When Upstream Does
	  Not Use VersionsIf there never was a version upstream, do not invent one
	  like 0.1 or 1.0.
	  Create the port with a DISTVERSION of
	  g,
	  where YYYYMMDDg is for
	  Git, and
	  
	  represents the date the commit referenced in
	  YYYYMMDDGH_TAGNAME.
PORTNAME= bar DISTVERSION= g20140411 USE_GITHUB= yes GH_TAGNAME= c472d66b
This creates a versioning scheme that increases over
	  time, and that is still before version 0
	  (see Example 5.1, “Using pkg-version(8) to Compare Versions.” for
	  details on pkg-version(8)):
%pkg version -t g20140411 0<
Which means using PORTEPOCH will not
	  be needed in case upstream decides to cut versions in the
	  future.
USE_GITHUB to Access
	  a Commit Between Two VersionsIf the current version of the software uses a Git tag, and the port needs to be updated to a newer, intermediate version, without a tag, use git-describe(1) to find out the version to use:
%git describe --tagsv0.7.3-14-gf0038b1f0038b1
v0.7.3-14-gf0038b1 can be split into
	  three parts:
v0.7.3This is the last Git tag that appears in the commit history before the requested commit.
-14This means that the requested commit,
		f0038b1, is the 14th commit after
		the v0.7.3 tag.
-gf0038b1The -g means
		“Git”, and
		the f0038b1 is the commit hash
		that this reference points to.
PORTNAME= bar DISTVERSIONPREFIX= v DISTVERSION= 0.7.3-14 DISTVERSIONSUFFIX= -gf0038b1 USE_GITHUB= yes
This creates a versioning scheme that increases over
	  time (well, over commits), and does not conflict with the
	  creation of a 0.7.4 version.
	  (See Example 5.1, “Using pkg-version(8) to Compare Versions.” for
	  details on pkg-version(8)):
%pkg version -t 0.7.3 0.7.3.14<%pkg version -t 0.7.3.14 0.7.4<
If the requested commit is the same as a tag, a shorter description is shown by default. The longer version is equivalent:
%git describe --tagsv0.7.3c66c71d%git describe --tags --longv0.7.3-0-gc66c71dc66c71d
The USE_GITHUB framework also
	  supports fetching multiple distribution files from
	  different places in GitHub.  It works in a way very
	  similar to Section 5.4.9, “Multiple Distribution or Patches Files from Multiple
	Locations”.
Multiple values are added to
	  GH_ACCOUNT,
	  GH_PROJECT, and
	  GH_TAGNAME.  Each different value is
	  assigned a group.  The main value can either have no group,
	  or the :DEFAULT group.  A value can be
	  omitted if it is the same as the default as listed in
	  Table 5.5, “USE_GITHUB Description”.
GH_TUPLE can also be used when there
	  are a lot of distribution files.  It helps keep the account,
	  project, tagname, and group information at the same
	  place.
For each group, a
	  ${WRKSRC_
	  helper variable is created, containing the directory into
	  which the file has been extracted.  The
	  group}${WRKSRC_
	  variables can be used to move directories around during
	  group}post-extract, or add to
	  CONFIGURE_ARGS, or whatever is needed
	  so that the software builds correctly.
The
	    : part
	    must be used for only
	      one distribution file.  It is used as a
	    unique key and using it more than once will overwrite the
	    previous values.group
As this is only syntactic sugar above
	    DISTFILES and
	    MASTER_SITES, the group names must
	    adhere to the restrictions on group names outlined in
	    Section 5.4.9, “Multiple Distribution or Patches Files from Multiple
	Locations”
When fetching multiple files from GitHub, sometimes the default distribution file is not fetched from GitHub. To disable fetching the default distribution, set:
USE_GITHUB= nodefault
When using USE_GITHUB=nodefault,
	    the Makefile must set
	    DISTFILES in its
	    top block.
	    The definition should be:
DISTFILES=    ${DISTNAME}${EXTRACT_SUFX}USE_GITHUB with Multiple
	    Distribution FilesFrom time to time, there is a need to fetch more
	    than one distribution file.  For example, when the
	    upstream git repository uses submodules.  This can be
	    done easily using groups in the
	    GH_
	    variables:*
PORTNAME=	foo
DISTVERSION=	1.0.2
USE_GITHUB=	yes
GH_ACCOUNT=	bar:icons,contrib
GH_PROJECT=	foo-icons:icons foo-contrib:contrib
GH_TAGNAME=	1.0:icons fa579bc:contrib
GH_SUBDIR=	ext/icons:icons
CONFIGURE_ARGS=	--with-contrib=${WRKSRC_contrib}This will fetch three distribution files from
	    github.  The default one comes from
	    foo/foo and is version
	    1.0.2.  The second one, with the
	    icons group, comes from
	    bar/foo-icons and is in version
	    1.0.  The third one comes from
	    bar/foo-contrib and uses the
	    Git commit
	    fa579bc.  The distribution files are
	    named foo-foo-1.0.2_GH0.tar.gz,
	    bar-foo-icons-1.0_GH0.tar.gz, and
	    bar-foo-contrib-fa579bc_GH0.tar.gz.
All the distribution files are extracted in
	    ${WRKDIR} in their respective
	    subdirectories.  The default file is still extracted in
	    ${WRKSRC}, in this case,
	    ${WRKDIR}/foo-1.0.2.  Each
	    additional distribution file is extracted in
	    ${WRKSRC_.
	    Here, for the group}icons group, it is called
	    ${WRKSRC_icons} and it contains
	    ${WRKDIR}/foo-icons-1.0.  The file
	    with the contrib group is called
	    ${WRKSRC_contrib} and contains
	    ${WRKDIR}/foo-contrib-fa579bc.
The software's build system expects to find the icons
	    in a ext/icons subdirectory in its
	    sources, so GH_SUBDIR is used.
	    GH_SUBDIR makes sure that
	    ext exists, but that
	    ext/icons does not already exist.
	    Then it does this:
post-extract:
      @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/iconsUSE_GITHUB with Multiple
	    Distribution Files Using
	    GH_TUPLEThis is functionally equivalent to Example 5.15, “Use of USE_GITHUB with Multiple
	    Distribution Files”, but
	    using GH_TUPLE:
PORTNAME=	foo
DISTVERSION=	1.0.2
USE_GITHUB=	yes
GH_TUPLE=	bar:foo-icons:1.0:icons/ext/icons \
		bar:foo-contrib:fa579bc:contrib
CONFIGURE_ARGS=	--with-contrib=${WRKSRC_contrib}Grouping was used in the previous example with
	    bar:icons,contrib.  Some redundant
	    information is present with GH_TUPLE
	    because grouping is not possible.
USE_GITHUB with
	    Git Submodules?Ports with GitHub as an upstream repository sometimes use submodules. See git-submodule(1) for more information.
The problem with submodules is that each is a separate repository. As such, they each must be fetched separately.
Using finance/moneymanagerex as an
	    example, its GitHub repository is https://github.com/moneymanagerex/moneymanagerex.
	    It has a .gitmodules
	    file at the root.  This file describes all the submodules
	    used in this repository, and lists additional repositories
	    needed.  This file will tell what additional repositories
	    are needed:
[submodule "lib/wxsqlite3"] path = lib/wxsqlite3 url = https://github.com/utelle/wxsqlite3.git [submodule "3rd/mongoose"] path = 3rd/mongoose url = https://github.com/cesanta/mongoose.git [submodule "3rd/LuaGlue"] path = 3rd/LuaGlue url = https://github.com/moneymanagerex/LuaGlue.git [submodule "3rd/cgitemplate"] path = 3rd/cgitemplate url = https://github.com/moneymanagerex/html-template.git [...]
The only information missing from that file is the commit hash or tag to use as a version. This information is found after cloning the repository:
%git clone --recurse-submodules https://github.com/moneymanagerex/moneymanagerex.gitCloning into 'moneymanagerex'... remote: Counting objects: 32387, done. [...] Submodule '3rd/LuaGlue' (https://github.com/moneymanagerex/LuaGlue.git) registered for path '3rd/LuaGlue' Submodule '3rd/cgitemplate' (https://github.com/moneymanagerex/html-template.git) registered for path '3rd/cgitemplate' Submodule '3rd/mongoose' (https://github.com/cesanta/mongoose.git) registered for path '3rd/mongoose' Submodule 'lib/wxsqlite3' (https://github.com/utelle/wxsqlite3.git) registered for path 'lib/wxsqlite3' [...] Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/LuaGlue'... Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/cgitemplate'... Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/mongoose'... Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/lib/wxsqlite3'... [...] Submodule path '3rd/LuaGlue': checked out 'c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b' Submodule path '3rd/cgitemplate': checked out 'cd434eeeb35904ebcd3d718ba29c281a649b192c' Submodule path '3rd/mongoose': checked out '2140e5992ab9a3a9a34ce9a281abf57f00f95cda' Submodule path 'lib/wxsqlite3': checked out 'fb66eb230d8aed21dec273b38c7c054dcb7d6b51' [...]%cd moneymanagerex%git submodule statusc51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b 3rd/LuaGlue (heads/master) cd434eeeb35904ebcd3d718ba29c281a649b192c 3rd/cgitemplate (cd434ee) 2140e5992ab9a3a9a34ce9a281abf57f00f95cda 3rd/mongoose (6.2-138-g2140e59) fb66eb230d8aed21dec273b38c7c054dcb7d6b51 lib/wxsqlite3 (v3.4.0) [...]
It can also be found on GitHub.  Each subdirectory
	    that is a submodule is shown as
	    directory @ hash,
	    for example,
	    mongoose @ 2140e59.
While getting the information from GitHub seems more
	      straightforward, the information found using
	      git submodule status will provide
	      more meaningful information.  For example, here,
	      lib/wxsqlite3's commit hash
	      fb66eb2 correspond to
	      v3.4.0.  Both can be used
	      interchangeably, but when a tag is available, use
	      it.
Now that all the required information has been
	    gathered, the Makefile can be written
	    (only GitHub-related lines are shown):
PORTNAME= moneymanagerex DISTVERSIONPREFIX= v DISTVERSION= 1.3.0 USE_GITHUB= yes GH_TUPLE= utelle:wxsqlite3:v3.4.0:wxsqlite3/lib/wxsqlite3 \ moneymanagerex:LuaGlue:c51d11a:lua_glue/3rd/LuaGlue \ moneymanagerex:html-template:cd434ee:html_template/3rd/cgitemplate \ cesanta:mongoose:2140e59:mongoose/3rd/mongoose \ [...]
Similar to GitHub, if the distribution file comes from gitlab.com or is hosting the GitLab software, these variables are available for use and might need to be set.
USE_GITLAB Description| Variable | Description | Default | 
|---|---|---|
GL_SITE | Site name hosting the GitLab project | https://gitlab.com | 
GL_ACCOUNT | Account name of the GitLab user hosting the project | ${PORTNAME} | 
GL_PROJECT | Name of the project on GitLab | ${PORTNAME} | 
GL_COMMIT | The commit hash to download. Must be the full 160 bit, 40 character hex sha1 hash. This is a required variable for GitLab. | (none) | 
GL_SUBDIR | When the software needs an additional
                distribution file to be extracted within
                ${WRKSRC}, this variable can be
                used.  See the examples in Section 5.4.4.1, “Fetching Multiple Files from GitLab”
                for more information. | (none) | 
GL_TUPLE | GL_TUPLE allows putting
                GL_SITE,
                GL_ACCOUNT,
                GL_PROJECT,
                GL_COMMIT, and
                GL_SUBDIR into a single variable.
                The format is
                site:account:project:commit:group/subdir.
                The site: and
                /subdir
                part is optional. It is helpful when there are more
                than one GitLab project from
                which to fetch. | 
USE_GITLABWhile trying to make a port for version
          1.14 of libsignon-glib
          from the accounts-sso user on gitlab.com, at https://gitlab.com/accounts-sso/libsignon-glib, The
          Makefile would end up looking like
          this for fetching the distribution files:
PORTNAME= libsignon-glib DISTVERSION= 1.14 USE_GITLAB= yes GL_ACCOUNT= accounts-sso GL_COMMIT= e90302e342bfd27bc8c9132ab9d0ea3d8723fd03
It will automatically have
          MASTER_SITES set to gitlab.com
          and WRKSRC to
          ${WRKDIR}/libsignon-glib-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03.
USE_GITLABA more complete use of the above if
          port had no versioning and foobar
          from the foo user on project bar on a self hosted GitLab
          site https://gitlab.example.com, the Makefile
          ends up looking like this for fetching distribution files:
PORTNAME= foobar DISTVERSION= g20170906 USE_GITLAB= yes GL_SITE= https://gitlab.example.com GL_ACCOUNT= foo GL_PROJECT= bar GL_COMMIT= 9c1669ce60c3f4f5eb43df874d7314483fb3f8a6
It will have MASTER_SITES set to
          "https://gitlab.example.com" and WRKSRC to
          ${WRKDIR}/bar-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6.
20170906 is the date of the
            commit referenced in GL_COMMIT, not
            the date the Makefile is edited, or
            the date the commit to the FreeBSD ports tree is made.
GL_SITE's protocol, port and
            webroot can all be modified in the same variable.
The USE_GITLAB framework also
            supports fetching multiple distribution files from
            different places from GitLab
            and GitLab hosted sites. It
            works in a way very similar to Section 5.4.9, “Multiple Distribution or Patches Files from Multiple
	Locations” and Section 5.4.4.1, “Fetching Multiple Files from GitLab”.
Multiple values are added to
            GL_SITE,
            GL_ACCOUNT,
            GL_PROJECT and
            GL_COMMIT.  Each different value is
            assigned a group.
            Table 5.6, “USE_GITLAB Description”.
GL_TUPLE can also be used when there
            are a lot of distribution files.  It helps keep the site,
            account, project, commit, and group information at the same
            place.
For each group, a
            ${WRKSRC_
            helper variable is created, containing the directory into
            which the file has been extracted.  The
            group}${WRKSRC_
            variables can be used to move directories around during
            group}post-extract, or add to
            CONFIGURE_ARGS, or whatever is needed
            so that the software builds correctly.
The
              : part
              must be used for only
              one distribution file.  It is used as a
              unique key and using it more than once will overwrite the
              previous values.group
As this is only syntactic sugar above
              DISTFILES and
              MASTER_SITES, the group names must
              adhere to the restrictions on group names outlined in
              Section 5.4.9, “Multiple Distribution or Patches Files from Multiple
	Locations”
When fetching multiple files using GitLab, sometimes the default distribution file is not fetched from a GitLab site. To disable fetching the default distribution, set:
USE_GITLAB= nodefault
When using USE_GITLAB=nodefault,
	    the Makefile must set
	    DISTFILES in its
	    top block.
	    The definition should be:
DISTFILES=    ${DISTNAME}${EXTRACT_SUFX}USE_GITLAB with Multiple
            Distribution FilesFrom time to time, there is a need to fetch more
              than one distribution file.  For example, when the
              upstream git repository uses submodules.  This can be
              done easily using groups in the
              GL_
              variables:*
PORTNAME=	foo
DISTVERSION=	1.0.2
USE_GITLAB=	yes
GL_SITE=	https://gitlab.example.com:9434/gitlab:icons
GL_ACCOUNT=	bar:icons,contrib
GL_PROJECT=	foo-icons:icons foo-contrib:contrib
GL_COMMIT=	c189207a55da45305c884fe2b50e086fcad4724b ae7368cab1ca7ca754b38d49da064df87968ffe4:icons 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib
GL_SUBDIR=	ext/icons:icons
CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}This will fetch two distribution files from
              gitlab.com and one from gitlab.example.com
              hosting GitLab. The default one comes
              from https://gitlab.com/foo/foo and commit is
              c189207a55da45305c884fe2b50e086fcad4724b. The
              second one, with the icons group, comes from
              https://gitlab.example.com:9434/gitlab/bar/foo-icons
              and commit is ae7368cab1ca7ca754b38d49da064df87968ffe4.
              The third one comes from https://gitlab.com/bar/foo-contrib
              and is commit 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a.
              The distribution files are named foo-foo-c189207a55da45305c884fe2b50e086fcad4724b_GL0.tar.gz,
              bar-foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4_GL0.tar.gz, and
              bar-foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a_GL0.tar.gz.
All the distribution files are extracted in
              ${WRKDIR} in their respective
              subdirectories.  The default file is still extracted in
              ${WRKSRC}, in this case,
              ${WRKDIR}/foo-c189207a55da45305c884fe2b50e086fcad4724b-c189207a55da45305c884fe2b50e086fcad4724b.
              Each additional distribution file is extracted in
              ${WRKSRC_.
              Here, for the group}icons group, it is called
              ${WRKSRC_icons} and it contains
              ${WRKDIR}/foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4-ae7368cab1ca7ca754b38d49da064df87968ffe4.
              The file with the contrib group is
              called ${WRKSRC_contrib} and contains
              ${WRKDIR}/foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a.
The software's build system expects to find the icons
              in a ext/icons subdirectory in its
              sources, so GL_SUBDIR is used.
              GL_SUBDIR makes sure that
              ext exists, but that
              ext/icons does not already exist.
              Then it does this:
post-extract:
        @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/iconsUSE_GITLAB with Multiple
            Distribution Files Using
            GL_TUPLEThis is functionally equivalent to Example 5.20, “Use of USE_GITLAB with Multiple
            Distribution Files”, but
              using GL_TUPLE:
PORTNAME=	foo
DISTVERSION=	1.0.2
USE_GITLAB=	yes
GL_COMMIT=	c189207a55da45305c884fe2b50e086fcad4724b
GL_TUPLE=	https://gitlab.example.com:9434/gitlab:bar:foo-icons:ae7368cab1ca7ca754b38d49da064df87968ffe4:icons/ext/icons \
		bar:foo-contrib:9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib
CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}Grouping was used in the previous example with
              bar:icons,contrib.  Some redundant
              information is present with GL_TUPLE
              because grouping is not possible.
If there is one distribution file, and it uses an odd
	suffix to indicate the compression mechanism, set
	EXTRACT_SUFX.
For example, if the distribution file was named
	foo.tar.gzip instead of the more normal
	foo.tar.gz, write:
DISTNAME= foo EXTRACT_SUFX= .tar.gzip
The
	USES=tar[:,
	xxx]USES=lha or USES=zip
	automatically set EXTRACT_SUFX to the most
	common archives extensions as necessary, see Chapter 17, Using USES Macros for more details.  If neither of
	these are set then EXTRACT_SUFX defaults to
	.tar.gz.
As EXTRACT_SUFX is only used in
	  DISTFILES, only set one of them..
Sometimes the names of the files to be downloaded have no
	resemblance to the name of the port.  For example, it might be
	called source.tar.gz or similar.  In
	other cases the application's source code might be in several
	different archives, all of which must be downloaded.
If this is the case, set DISTFILES to
	be a space separated list of all the files that must be
	downloaded.
DISTFILES= source1.tar.gz source2.tar.gz
If not explicitly set, DISTFILES
	defaults to
	${DISTNAME}${EXTRACT_SUFX}.
If only some of the DISTFILES must be
	extracted—for example, one of them is the source code,
	while another is an uncompressed document—list the
	filenames that must be extracted in
	EXTRACT_ONLY.
DISTFILES= source.tar.gz manual.html EXTRACT_ONLY= source.tar.gz
When none of the DISTFILES need to be
	uncompressed, set EXTRACT_ONLY to the empty
	string.
EXTRACT_ONLY=
If the port requires some additional patches that are
	available by FTP or
	HTTP, set PATCHFILES to
	the names of the files and PATCH_SITES to
	the URL of the directory that contains them (the format is the
	same as MASTER_SITES).
If the patch is not relative to the top of the source tree
	(that is, WRKSRC) because it contains some
	extra pathnames, set PATCH_DIST_STRIP
	accordingly.  For instance, if all the pathnames in the patch
	have an extra foozolix-1.0/ in front of the
	filenames, then set
	PATCH_DIST_STRIP=-p1.
Do not worry if the patches are compressed; they will be
	decompressed automatically if the filenames end with
	.Z, .gz,
	.bz2 or .xz.
If the patch is distributed with some other files, such as
	documentation, in a compressed tarball, using
	PATCHFILES is not possible.  If that is the
	case, add the name and the location of the patch tarball to
	DISTFILES and
	MASTER_SITES.  Then, use
	EXTRA_PATCHES to point to those
	files and bsd.port.mk will automatically
	apply them.  In particular, do
	not copy patch files into
	${PATCHDIR}.  That directory may
	not be writable.
If there are multiple patches and they need mixed values
	  for the strip parameter, it can be added alongside the patch
	  name in PATCHFILES, e.g:
PATCHFILES= patch1 patch2:-p1
This does not conflict with the master site grouping feature, adding a group also works:
PATCHFILES= patch2:-p1:source2
The tarball will have been extracted alongside the
	  regular source by then, so there is no need to explicitly
	  extract it if it is a regular compressed tarball.  Take extra
	  care not to overwrite something that already exists in that
	  directory if extracting it manually.  Also, do not forget to
	  add a command to remove the copied patch in the
	  pre-clean target.
(Consider this to be a somewhat “advanced topic”; those new to this document may wish to skip this section at first).
This section has information on the fetching mechanism
	known as both MASTER_SITES:n and
	MASTER_SITES_NN.  We will refer to this
	mechanism as MASTER_SITES:n.
A little background first.  OpenBSD has a neat feature
	inside DISTFILES and
	PATCHFILES which allows files and
	patches to be postfixed with :n
	identifiers.  Here, n can be any word
	containing [0-9a-zA-Z_] and denote a group
	designation.  For example:
DISTFILES= alpha:0 beta:1
In OpenBSD, distribution file alpha
	will be associated with variable
	MASTER_SITES0 instead of our common
	MASTER_SITES and
	beta with
	MASTER_SITES1.
This is a very interesting feature which can decrease that endless search for the correct download site.
Just picture 2 files in DISTFILES and
	20 sites in MASTER_SITES, the sites slow as
	hell where beta is carried by all sites
	in MASTER_SITES, and
	alpha can only be found in the 20th site.
	It would be such a waste to check all of them if the
	maintainer knew this beforehand, would it not?  Not a good
	start for that lovely weekend!
Now that you have the idea, just imagine more
	DISTFILES and more
	MASTER_SITES.  Surely our
	“distfiles survey meister” would appreciate the
	relief to network strain that this would bring.
In the next sections, information will follow on the FreeBSD implementation of this idea. We improved a bit on OpenBSD's concept.
The group names cannot have dashes in them
	  (-), in fact, they cannot have any
	  characters out of the [a-zA-Z0-9_] range.
	  This is because, while make(1) is ok with variable
	  names containing dashes, sh(1) is not.
This section explains how to quickly prepare fine
	  grained fetching of multiple distribution files and patches
	  from different sites and subdirectories.  We describe here a
	  case of simplified MASTER_SITES:n usage.
	  This will be sufficient for most scenarios.  More detailed
	  information are available in Section 5.4.9.2, “Detailed Information”.
Some applications consist of multiple distribution files that must be downloaded from a number of different sites. For example, Ghostscript consists of the core of the program, and then a large number of driver files that are used depending on the user's printer. Some of these driver files are supplied with the core, but many others must be downloaded from a variety of different sites.
To support this, each entry in
	  DISTFILES may be followed by a colon and
	  a “group name”.  Each site listed in
	  MASTER_SITES is then followed by a colon,
	  and the group that indicates which distribution files are
	  downloaded from this site.
For example, consider an application with the source
	  split in two parts, source1.tar.gz and
	  source2.tar.gz, which must be
	  downloaded from two different sites.  The port's
	  Makefile would include lines like Example 5.22, “Simplified Use of MASTER_SITES:n
	    with One File Per Site”.
MASTER_SITES:n
	    with One File Per SiteMASTER_SITES= ftp://ftp1.example.com/:source1 \ http://www.example.com/:source2 DISTFILES= source1.tar.gz:source1 \ source2.tar.gz:source2
Multiple distribution files can have the same group.
	  Continuing the previous example, suppose that there was a
	  third distfile, source3.tar.gz, that
	  is downloaded from
	  ftp.example2.com.  The
	  Makefile would then be written like
	  Example 5.23, “Simplified Use of MASTER_SITES:n
	    with More Than One File Per Site”.
MASTER_SITES:n
	    with More Than One File Per SiteMASTER_SITES= ftp://ftp.example.com/:source1 \ http://www.example.com/:source2 DISTFILES= source1.tar.gz:source1 \ source2.tar.gz:source2 \ source3.tar.gz:source2
Okay, so the previous example did not reflect the new
	  port's needs?  In this section we will explain in detail how
	  the fine grained fetching mechanism
	  MASTER_SITES:n works and how it can
	  be used.
Elements can be postfixed with
	      : where
	      nn is
	      [^:,]+, that is,
	      n could conceptually be any
	      alphanumeric string but we will limit it to
	      [a-zA-Z_][0-9a-zA-Z_]+ for
	      now.
Moreover, string matching is case sensitive; that
	      is, n is different from
	      N.
However, these words cannot be used for
	      postfixing purposes since they yield special meaning:
	      default, all and
	      ALL (they are used internally in
	      item ii).
	      Furthermore, DEFAULT is a special
	      purpose word (check item 3).
Elements postfixed with :n
	      belong to the group n,
	      :m belong to group
	      m and so forth.
Elements without a postfix are groupless, they
	      all belong to the special group
	      DEFAULT.  Any elements postfixed
	      with DEFAULT, is just being
	      redundant unless an element belongs
	      to both DEFAULT and other groups at
	      the same time (check item 5).
These examples are equivalent but the first one is preferred:
MASTER_SITES= alpha
MASTER_SITES= alpha:DEFAULT
Groups are not exclusive, an element may belong to several different groups at the same time and a group can either have either several different elements or none at all.
When an element belongs to several groups
	      at the same time, use the comma operator
	      (,).
Instead of repeating it several times, each time
	      with a different postfix, we can list several groups at
	      once in a single postfix.  For instance,
	      :m,n,o marks an element that belongs
	      to group m, n and
	      o.
All these examples are equivalent but the last one is preferred:
MASTER_SITES= alpha alpha:SOME_SITE
MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
MASTER_SITES= alpha:SOME_SITE,DEFAULT
MASTER_SITES= alpha:DEFAULT,SOME_SITE
All sites within a given group are sorted according
	      to MASTER_SORT_AWK.  All groups
	      within MASTER_SITES and
	      PATCH_SITES are sorted as
	      well.
Group semantics can be used in any of the
	      variables MASTER_SITES,
	      PATCH_SITES,
	      MASTER_SITE_SUBDIR,
	      PATCH_SITE_SUBDIR,
	      DISTFILES, and
	      PATCHFILES according to this
	      syntax:
All MASTER_SITES,
		  PATCH_SITES,
		  MASTER_SITE_SUBDIR and
		  PATCH_SITE_SUBDIR elements must
		  be terminated with the forward slash
		  / character.  If any elements
		  belong to any groups, the group postfix
		  :
		  must come right after the terminator
		  n/.  The
		  MASTER_SITES:n mechanism relies
		  on the existence of the terminator
		  / to avoid confusing elements
		  where a :n is a valid part of the
		  element with occurrences where :n
		  denotes group n.  For
		  compatibility purposes, since the
		  / terminator was not required
		  before in both MASTER_SITE_SUBDIR
		  and PATCH_SITE_SUBDIR elements,
		  if the postfix immediate preceding character is not
		  a / then :n
		  will be considered a valid part of the element
		  instead of a group postfix even if an element is
		  postfixed with :n.  See both
		  Example 5.24, “Detailed Use of
		    MASTER_SITES:n in
		    MASTER_SITE_SUBDIR”
		  and Example 5.25, “Detailed Use of
		    MASTER_SITES:n with Comma
		    Operator, Multiple Files, Multiple Sites and
		    Multiple Subdirectories”.
MASTER_SITES:n in
		    MASTER_SITE_SUBDIRMASTER_SITE_SUBDIR= old:n new/:NEW
Directories within group
			DEFAULT ->
			old:n
Directories within group
			NEW -> new
MASTER_SITES:n with Comma
		    Operator, Multiple Files, Multiple Sites and
		    Multiple SubdirectoriesMASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \ http://site3/:group3 http://site4/:group4 \ http://site5/:group5 http://site6/:group6 \ http://site7/:DEFAULT,group6 \ http://site8/%SUBDIR%/:group6,group7 \ http://site9/:group8 DISTFILES= file1 file2:DEFAULT file3:group3 \ file4:group4,group5,group6 file5:grouping \ file6:group7 MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \ directory-one/:group6,DEFAULT \ directory
The previous example results in this fine grained fetching. Sites are listed in the exact order they will be used.
file1 will be
			fetched from
MASTER_SITE_OVERRIDE
http://site1/directory-trial:1/
http://site1/directory-one/
http://site1/directory/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file2 will be fetched
			exactly as file1 since
			they both belong to the same group
MASTER_SITE_OVERRIDE
http://site1/directory-trial:1/
http://site1/directory-one/
http://site1/directory/
http://site2/
http://site7/
MASTER_SITE_BACKUP
file3 will be fetched
			from
MASTER_SITE_OVERRIDE
http://site3/
MASTER_SITE_BACKUP
file4 will be
			fetched from
MASTER_SITE_OVERRIDE
http://site4/
http://site5/
http://site6/
http://site7/
http://site8/directory-one/
MASTER_SITE_BACKUP
file5 will be fetched
			from
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file6 will be fetched
			from
MASTER_SITE_OVERRIDE
http://site8/
MASTER_SITE_BACKUP
How do I group one of the special macros from
	      bsd.sites.mk, for example,
	      SourceForge (SF)?
This has been simplified as much as possible.  See
	      Example 5.26, “Detailed Use of MASTER_SITES:n
		with SourceForge (SF)”.
MASTER_SITES:n
		with SourceForge (SF)MASTER_SITES= http://site1/ SF/something/1.0:sourceforge,TEST DISTFILES= something.tar.gz:sourceforge
something.tar.gz will be
		fetched from all sites within SourceForge.
How do I use this with
	      PATCH?*
All examples were done with
	      MASTER
	      but they work exactly the same for
	      *PATCH
	      ones as can be seen in Example 5.27, “Simplified Use of
		*MASTER_SITES:n with
		PATCH_SITES”.
MASTER_SITES:n with
		PATCH_SITESPATCH_SITES= http://site1/ http://site2/:test PATCHFILES= patch1:test
All current ports remain the same.  The
	      MASTER_SITES:n feature code is only
	      activated if there are elements postfixed with
	      : like
	      elements according to the aforementioned syntax rules,
	      especially as shown in item 7.n
The port targets remain the same:
	      checksum,
	      makesum,
	      patch,
	      configure,
	      build, etc.  With the obvious
	      exceptions of do-fetch,
	      fetch-list,
	      master-sites and
	      patch-sites.
do-fetch: deploys
		  the new grouping postfixed
		  DISTFILES and
		  PATCHFILES with their matching
		  group elements within both
		  MASTER_SITES and
		  PATCH_SITES which use matching
		  group elements within both
		  MASTER_SITE_SUBDIR and
		  PATCH_SITE_SUBDIR.  Check Example 5.25, “Detailed Use of
		    MASTER_SITES:n with Comma
		    Operator, Multiple Files, Multiple Sites and
		    Multiple Subdirectories”.
fetch-list: works
		  like old fetch-list with
		  the exception that it groups just like
		  do-fetch.
master-sites and
		  patch-sites:
		  (incompatible with older versions) only return the
		  elements of group DEFAULT; in
		  fact, they execute targets
		  master-sites-default and
		  patch-sites-default
		  respectively.
Furthermore, using target either
		  master-sites-all or
		  patch-sites-all is
		  preferred to directly checking either
		  MASTER_SITES or
		  PATCH_SITES.  Also,
		  directly checking is not guaranteed to work in any
		  future versions.  Check item B
		  for more information on these new port
		  targets.
New port targets
There are
		  master-sites-
		  and
		  npatch-sites-
		  targets which will list the elements of the
		  respective group nn
		  within MASTER_SITES and
		  PATCH_SITES respectively.  For
		  instance, both
		  master-sites-DEFAULT
		  and patch-sites-DEFAULT
		  will return the elements of group
		  DEFAULT,
		  master-sites-test and
		  patch-sites-test of
		  group test, and thereon.
There are new targets
		  master-sites-all and
		  patch-sites-all which do
		  the work of the old
		  master-sites and
		  patch-sites ones.  They
		  return the elements of all groups as if they all
		  belonged to the same group with the caveat that it
		  lists as many MASTER_SITE_BACKUP
		  and MASTER_SITE_OVERRIDE as there
		  are groups defined within either
		  DISTFILES or
		  PATCHFILES; respectively for
		  master-sites-all and
		  patch-sites-all.
Do not let the port clutter
	/usr/ports/distfiles.  If the port
	requires a lot of files to be fetched, or contains a file that
	has a name that might conflict with other ports (for example,
	Makefile), set
	DIST_SUBDIR to the name of the port
	(${PORTNAME} or
	${PKGNAMEPREFIX}${PORTNAME} are
	fine).  This will change DISTDIR from the
	default /usr/ports/distfiles to
	/usr/ports/distfiles/${DIST_SUBDIR}, and
	in effect puts everything that is required for the port into
	that subdirectory.
It will also look at the subdirectory with the same name
	on the backup master site at http://distcache.FreeBSD.org
	(Setting
	DISTDIR explicitly in
	Makefile will not accomplish this, so
	please use DIST_SUBDIR.)
This does not affect
	  MASTER_SITES defined in the
	  Makefile.
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
    documentation may be
    sent to <freebsd-questions@FreeBSD.org>.
    Send questions about this document to <freebsd-doc@FreeBSD.org>.