summaryrefslogtreecommitdiffstats
path: root/APKBUILD.5.scd
blob: 9d04a2e47016225b8953beaa662df08158a1cacb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
APKBUILD(5)

# NAME

*APKBUILD* - metadata and instructions to build a package


# SYNOPSIS

/usr/src/packages/<repo>/<package>/APKBUILD


# DESCRIPTION

An *APKBUILD* file is used by tools such as abuild(1) to build a package for
eventual installation by the apk(8) package manager. It defines metadata such
as the name of the package, the version information, the source license,
and contact information for the developer. It additionally contains the
commands needed to build, test, and install the package.

The *APKBUILD* format is similar to a typical shell script; you set
pre-defined variables and implement pre-defined functions, and the abuild(1)
(or similar) utility will use them to create the package.


## Required Variables

The following variables must be set in all *APKBUILD* files:

*pkgname*
	Specifies the name of the package. This is typically the name of the
	package upstream; however, note that all letters must be lowercased.

	Libraries for scripting languages should have a prefix before the
	library name describing the language. Such prefixes include _lua-_,
	_perl-_, _py-_, and _rb-_. Not all languages use prefixes. For a
	definitive list, consult the PREFIXES file in the root directory
	of the repository you are using for packaging.

*pkgver*
	Specifies the version of the software being packaged. The version of
	a package must consist of one or more numbers separated by the radix
	(decimal point). The final number may have a single letter following
	it, for upstreams that use such a versioning scheme (such as 1.5a,
	1.5b, 1.5c).

	After the final number (and optional single letter), a suffix may
	be appended, which must be an underscore (\_) followed by one of
	_alpha_, _beta_, _pre_, _rc_, _cvs_, _svn_, _git_, _hg_, or _p_,
	optionally followed by another number. If the suffix is _alpha_,
	_beta_, _pre_, or _rc_, it is considered to be earlier than the
	version without a suffix; if the suffix is _cvs_, _svn, _git_, _hg_,
	or _p_, it is considered to be later than the version without a
	suffix. All of the following examples are valid versions, in order
	from lowest to highest:

	1.0, 1.1_alpha2, 1.1.3_pre, 1.1.3, 1.1.3_hg, 1.2, 1.2a, 1.2b

*pkgrel*
	Specifies the package release number of this particular package
	version.  This indicates when a package has changed without a
	corresponding change in version. Always increment *pkgrel* when you
	change the contents, dependencies, or metadata of a package. The
	first release of a package is always 0.

*pkgdesc*
	Specifies what the package contains. *pkgdesc* must be 128 characters
	or less, and should concisely describe what actions the software or
	items being package will allow the user to perform. For example,
	“Fully-featured word processor with spell check and plugins”
	would be a sufficient *pkgdesc* for AbiWord.

*url*
	Specifies the Web address of the package's upstream. This allows users
	and future maintainers to find documentation, release information,
	and contact information for the package. If no Web address is
	available for the package, you must set *url* to an empty string ("").

*arch*
	Specifies the architectures for which the package may be built. It
	is highly recommended that you set this variable to "_all_" if the
	package is portable.

	You may use "_noarch_" if the package does not contain any
	architecture-specific binary files - that is, any files that are
	compiled for the target only. Such packages may include pure Python
	packages, shell script packages, and JARs. If you are not sure what
	this means, using "_all_" is safe.

*license*
	Specifies the license under which the package is distributed. The
	value provided must match a SPDX license identifier.

*source*
	Specifies the location of both local and remote source files
	used to build the package. Typically, the remote source file(s)
	or archive(s) is specified, followed by any local patches, install
	scripts, configuration files, or other necessary files.


## Optional Variables

The following variables are not required, but may be set in any *APKBUILD*
file.

*checkdepends*
	Specifies test-time dependencies of the package. Common packages that
	are used for testing include check, dejagnu, and perl-test-command.

*depends*
	Specifies the run-time dependencies of the package. The abuild(1)
	utility will automatically scan the resultant package for shared
	library (.so) dependencies; do not specify them here.

*install*
	Specifies install scripts for the package, if any. See _Install
	Scripts_ for more information about install scripts.

*install_if*
	Specifies a condition when apk(8) should automatically install the
	package (or subpackage). For instance, the OpenRC subpackages set

	```
	install_if="openrc ${subpkgname%-openrc}=$pkgver-r$pkgrel"
	```

	which means that the OpenRC subpackage will be automatically
	installed if both OpenRC and the origin package are installed on
	the same computer.

*makedepends*
	Specifies build dependencies for the package.

*pkggroups*
	Specifies a space-separated list of login groups to create during
	build-time. Note that you will need to create the login groups
	in a pre-install script as well; see _Install Scripts_ for more
	information about install scripts.

*pkgusers*
	Specifies a space-separated list of user logins to create during
	build-time. Note that you will need to create the user logins in a
	pre-install install script as well; see _Install Scripts_ for more
	information about install scripts.

*provides*
	Specifies that the package "provides" the same contents as another
	package.  There are two formats that you may use for *provides*:
	a provider name, and a provider name with version.

	Specifying a provider name with version such as _foobar=1.2_ will
	cause the package to be an "alias" of _foobar_ version _1.2_. It
	will be automatically installed if a user then runs `apk add foobar`
	or similar, and it will conflict with a package named _foobar_.

	Specifying a provider name without a version such as _baz_ will
	cause the package to provide a "virtual" called _baz_. Multiple
	packages with the same virtual provider can be installed on a system;
	however, if a user runs \`apk add baz` they will be provided a list
	of packages that provide _baz_ and must select one and install it.

*provider_priority*
	Specifies the numeric value for apk(8) to use for the package when
	considering which provider should be installed for the same *provides*
	virtual provider.

*replaces*
	Specifies packages that the package replaces. This is typically
	used for packages renamed by upstream.

*replaces_priority*
	Specifies the numeric value that is used by apk(8) when multiple
	packages with *replaces* include the same file. It is also used
	to decide which package should define the permissions of a directory
	even without *replaces* set.

*subpackages*
	Specifies subpackages or split packages built with this
	package. Typically, this will include _$pkgname-dev_ for development
	files (such as _/usr/include_ and static library files) and
	_$pkgname-doc_ for documentation (such as _/usr/share/doc_ and
	_/usr/share/man_).

	Each subpackage may be specified using three different methods. The
	first, and most common, is _$pkgname-foo_ where _foo_ is the name
	of the split function specified later in the file. Similar to the
	*package* function, the _foo_ function must move files from _$pkgdir_
	or _$srcdir_ to _$subpkgdir_ after creating _$subpkgdir_.

	The second method is to simply call the subpackage _foo_ which will
	create a package called _foo_ instead of _$pkgname-foo_.

	However, _foo_ in both of these examples cannot contain an hyphen,
	as shell function names cannot have hyphens in them. In this case,
	the third method may be used: _foo:funcname_ where _foo_ is the name
	of the subpackage and _funcname_ is the name of the shell function
	in the *APKBUILD* that creates it.

*triggers*
	Specifies a trigger script used by the package. A trigger script
	is a shell script that is called whenever monitored files or
	directories are modified.  You may specify the paths to monitor
	using the triggers variable as follows:

	```
	$pkgname.trigger=/usr/share/man:/usr/local/share/man
	```

	This will run the package trigger script whenever files in
	_/usr/share/man_ or _/usr/local/share/man_ are created, modified,
	or removed.

*options*
	The *options* variable allows you to set parameters for the package
	at build time. There are a number of valid options you may set,
	and you may set multiple options by writing a space between each one.

	*!archcheck*
		Specifies that the package contains binaries that cannot
		run on the target architecture. This is primarily used for
		packages containing firmware, and should typically never
		be needed.

	*bigdocs*
		Specifies that this packages intentionally has a large -doc subpackage.
		Thereby suppressing a warning to be emitted if the -doc subpackage
		exceeds a certain package size threshold (currently 2 MiB).

	*charset.alias*
		Specifies that the package ships a _/usr/lib/charset.alias_
		file and that it should be installed on the user's
		system. This is almost never the case. Do not use this option.

	*!check*
		Specifies that the package will not run a test suite. The
		reason for disabling the check phase should be noted in
		a comment.

	*checkroot*
		Specifies that this package's test suite will be run in
		fakeroot(8).  This is necessary for some test suites which
		fail when run as non-root.

	*!dbg*
		Specifies that the package should not be built with a debug
		information package. This is the default unless DEFAULT_DBG
		is set in the environment or abuild.conf(5). It is typically
		used on packages that do not generate debug information
		(such as pure Python packages) or packages that do not
		support debug information packages.

	*!fhs*
		Specifies that the package violates FHS and installs to a
		location such as _/usr/local_, _/opt_, or _/srv_.

	*ldpath-recursive*
		Specifies that abuild(1) should use the *--recursive* argument
		to scanelf(1) when attempting to find shared library (.so)
		dependencies for the package.

	*lib64*
		Specifies that the package installs files under _/lib64_
		or _/usr/lib64_ and that the test for those directories
		should be skipped.  This is discouraged and should only be
		used for packages providing compatibility for GNU libc.

	*libtool*
		Specifies that the package requires its libtool (.la)
		files. They will not be automatically removed by abuild(1).

	*net*
		Specifies that the package build system requires access
		to a network.  This is discouraged and an issue should be
		filed with the package's authors.

	*!strip*
		Specifies that strip(1) should not be run on any of the
		package's binaries. This is automatically implying if the
		_-dbg_ subpackage is enabled, or if you are using DEFAULT_DBG.

	*suid*
		Specifies that binaries in the package may be installed
		set-uid. This is a security risk and it is highly recommended
		to use capabilities or process separation instead of set-uid
		where available.

	*setcap*
		Specifies that binaries in the package may be installed
		with extra setcap(8) capabilities. If this option is enabled,
		it is highly recommended to only make these binaries executable
		by root and users of a specific group, not by others.

	*textrels*
		Specifies that the package's binaries are known to contain
		relocations against text segments. By default, abuild(1)
		will refuse to create such a package because this is a
		security concern.

	*toolchain*
		Specifies that the package is part of the base toolchain
		set and may depend on packages like _g++_.

	*!tracedeps*
		Specifies that abuild(1) should not automatically populate
		*depends* with shared library (.so) or symlink target
		dependencies.


## Automatic Variables

The following variables are defined for you by abuild(1), but may be
overridden if necessary.

*builddir*
	Specifies the directory where the source code of the package will
	be built.  The default value is _$srcdir/$pkgname-$pkgver_ which
	is appropriate for most source distributions. If the source tarball
	does not create a _$pkgname-$pkgver_ directory when it is unpacked,
	you must override *builddir*.

*pkgdir*
	Specifies the directory where the built files will be
	installed. Typically, you will call `make DESTDIR="$pkgdir" install`
	or similar to install the files. The default value is _$startdir/pkg_
	and you should not modify this variable.

*srcdir*
	Specifies the directory where the files specified in *source*
	are downloaded and unpacked. The default value is _$startdir/src_
	and you should not need to modify this.

*startdir*
	Specifies the directory where the *APKBUILD* file resides.

*subpkgdir*
	Specifies the directory where the subpackage's files should be
	placed. This variable is only set inside subpackage functions.


## Special Variables

The following variables are used only in special circumstances, and may
be required or optional depending on their usage and the contents of other
variables.

*depends_dev*
	Specifies the run-time dependencies of the _-dev_ subpackage.

*depends_doc*
	Specifies the run-time dependencies of the _-doc_ subpackage.

*depends_libs*
	Specifies the run-time dependencies of the _-libs_ subpackage.

*depends_openrc*
	Specifies the run-time dependencies of the _-openrc_ subpackage.

*depends_static*
	Specifies the run-time dependencies of the _-static_ subpackage.

*giturl*
	Specifies the URL of the Git repository to use with `abuild
	snapshot`. If the default branch of the repository is not desired,
	a different one may be specified by appending *-b* _branch_ where
	_branch_ is the branch to checkout.


## Functions

Functions specified here may be present in any *APKBUILD* file, but with
the exception of *package*, are not strictly required.

*fetch*
	This function is called to download the remote files in *source*.

*unpack*
	This function unpacks any archives in *source* to *srcdir*.

*prepare*
	Prepares the source in *srcdir* to be built. The default *prepare*
	function ensures the build directories are set up correctly and
	applies any _\*.patch_ files specified in *source*. You must call
	*default_prepare* if you write a custom *prepare* function.

*build*
	Compiles the source in *builddir*. You must implement this function
	yourself. If no compilation is required, you may omit it.

*check*
	Runs the package's test suite. This function must implemented unless
	*!check* was specified in *options*.

*package*
	Installs the package into *pkgdir*. Note that *pkgdir* is not
	created for you; if this package installs no files (for example,
	a metapackage), you must use `mkdir -p "$pkgdir"` to skip the
	package phase.


## Install Scripts

An install script is run when an action is taken on a package by apk(8). An
install script must be written in shell and must have a _#!/bin/sh_
interpreter declaration as the first line. The *install* variable must
contain the install scripts needed by the package.

The install script will be run inside the root filesystem where the package
is being installed. A single argument will be passed to call scripts, which
is the version of the package being currently installed (or deinstalled). The
pre-upgrade and post-upgrade scripts will have an additional second argument,
which specifies the version of the package before the upgrade process.

The different actions that may have install scripts specified are as follows:

*$pkgname.pre-install*
	Executed before the package is installed. If this script exits with
	an error (non-zero exit code), apk(8) will halt the installation and
	the package will not be installed. This install script is typically
	used to create any users or groups needed as described in *pkggroups*
	and *pkgusers*.

*$pkgname.post-install*
	Executed after the package is installed. If this script exits
	with an error (non-zero exit code), apk(8) will mark the package as
	broken. The `apk fix` command will attempt to re-run the post-install
	script if this occurs.

*$pkgname.pre-upgrade*
	Executed before the package is upgraded. If this script exits with
	an error (non-zero exit code), apk(8) will mark the package as broken.

*$pkgname.post-upgrade*
	Executed after the package is upgraded. If this script exits with
	an error (non-zero exit code), apk(8) will mark the package as
	broken. The `apk fix` command will attempt to re-run the post-upgrade
	script if this occurs.

*$pkgname.pre-deinstall*
	Executed before the package is removed from the system. If this
	script exits with an error (non-zero exit code), apk(8) will not
	remove the package from the system.

*$pkgname.post-deinstall*
	Executed after the package is removed from the system. Exiting with
	an error will have no effect.


# IMPLEMENTATION NOTES

Currently, *APKBUILD* files are sourced as normal shells scripts. This may
change at a later date.


# COMPATIBILITY

The abuild(1) utility as distributed by Alpine Linux uses the BusyBox
Almquist shell, a part of busybox(1) that is currently undocumented. It is
mostly compliant with IEEE Std 1003.2 (“POSIX.2”), with some bash-like
extensions. The abuild(1) utility as distributed by Adélie uses the user's
preferred /bin/sh, which is typically bash(1).


# SEE ALSO

SPDX license reference (on the Web at <https://spdx.org/licenses/>),
abuild(1), newapkbuild(1), apk(8).


# HISTORY

The *APKBUILD* format and abuild(1) utility first appeared in Alpine
Linux 1.9.


# AUTHORS

Timo Teräs <_timo.teras@iki.fi_>++
Natanael Copa <_ncopa@alpinelinux.org_>

Documentation:++
A. Wilcox <_awilfox@adelielinux.org_>