projects/aports·blob v3.15.0_alpha20210804 · refs

190 lines · 5.8 KiB

Policy for APKBUILDs

This documents defines a policy for writing APKBUILDs.

Standard selection

APKBUILDs are POSIX shell scripts as defined in POSIX.1-2017 Volume 3 POSIX.1-2017 volume 3. Additionally, the following extensions are supported:

  1. The local keyword for introducing variables local to a function is supported, it is briefly documented in the bash manual.
  2. Non-POSIX parameter extensions are supported. This includes: Substring expansions (e.g. ${var:offset:length}) and Replacement expansions (e.g. ${var/pattern/string}). The bash manual contains further information on these two expansions.

NOTE: busybox ash is currently used to evaluate APKBUILDs since it supports additional POSIX shell extensions your APKBUILD might be evaluated correctly even if it is not confirming to this policy document.

Shell Style Considerations

Formatting

Indention

Indent with tabs, don’t use spaces. Avoid whitespaces.

Line Length

Maximum line length is 80 characters, this should be considered a recommendation and not a strict requirement which must be followed at all costs. Most notably, automatically generated parts (e.g. by abuild checksum) are except from this rule.

Compound Statements

Put ; do and ; then on the same line as the while, for or if.

Function Declarations

  • Always put the function name, the parenthesis and the curly brackets on the same line.
  • Don’t use spacing between function name and parenthesis.
  • Do use spacing between function parenthesis and curly brackets.

Case statement

  • Don’t indent alternatives.
  • A one-line alternative needs a space after the close parenthesis of the pattern and before the ;;.
  • End the last case with ;;.

Variable expansion

  • Use ${var} over $var only when it is strictly necessary. Meaning: Only if the character following the variable name is an underscore or an alphanumeric character.

Quoting

  • Always quote string literals (exceptions are assigning pkgname and pkgver, more on this below).
  • Always quote variables, command substitutions or shell meta characters when used in strings. Prefer "$var"/foo/bar over "$var/foo/bar".
  • Never quote literal integers.

Features

Command Substitution

  • Always use $() instead of backticks.

Test and [

  • Prefer [ over test(1).

Naming Conventions

Function Names

  • Lower-case, with underscores to separate words. Prefix all helper functions with an underscore character.

Variable Names

  • Lower-case, with underscores to separate words. Prefix all non-metadata variables with an underscore character.

Use Local Variables

  • Declare function-specific variables with the local keyword.

Calling Commands

Command Substitutions and Global Variables

  • Avoid command Substitutions in global variables, use parameter expansions instead.

Return Values

  • APKBUILDs are executed with set -e, explicit || return 1 statements must not be used.

Comments

Spacing

  • All comments begin with an ASCII space character, e.g. # foo.

TODO Comments

  • Use TODO comments for code that is temporary, a short-term solution, or good-enough but not perfect.

APKBUILD style considerations

Comments

Contributor Comment

  • All APKBUILDs begin with one or more contributor comments (one per line) containing a valid RFC 5322 address. For example, # Contributor: Max Mustermann <[email protected]>.

Maintainer Comment

  • All APKBUILDs contain exactly one maintainer comment containing a valid RFC 5322 address. For example, # Maintainer: Max Mustermann <[email protected]>.
  • In addition to a Maintainer Comment a Contributor Comment must be present for said Maintainer.

Metadata Variables

Metadata Variables are variables used directly by abuild itself, e.g. pkgname or depends.

Metadata Values

  • pkgname must only contain lowercase characters.
  • pkgname must match the name of the directory the APKBUILD file is located in.

Variable Assignments

  • Empty Metadata Variable assignments, e.g. install="" must be removed.
  • The Metadata Variable builddir defaults to $srcdir/$pkgname-$pkgver and should only be assigned if the default values is not appropriate.

Assignment Order

  • All Metadata Variables (except checksums) must be declared before the first function declaration.
  • Checksum Metadata Variables must be declared after the last function declaration, abuild checksum will automatically take care of this.

Build Functions

Function Declaration

  • Functions should be declared in the order they are called by abuild.
  • All functions are executed in "$builddir" explicit directory changes to $builddir must be avoided (if possible).
  • Variables local to functions must always be declared with the local keyword.

Function Overwriting

  • If the prepare function is overwritten it should always call default_prepare.
1# Policy for APKBUILDs
2
3This documents defines a policy for writing APKBUILDs.
4
5# Standard selection
6
7APKBUILDs are POSIX shell scripts as defined in [POSIX.1-2017 Volume 3]
8[POSIX.1-2017 volume 3]. Additionally, the following extensions are
9supported:
10
111. The `local` keyword for introducing variables local to a function is
12 supported, it is briefly documented in the [bash manual][bash functions].
132. Non-POSIX [parameter extensions][POSIX.1-2017 parameter expansion]
14 are supported. This includes: Substring expansions (e.g.
15 `${var:offset:length}`) and Replacement expansions (e.g.
16 `${var/pattern/string}`). The [bash manual][bash expansion]
17 contains further information on these two expansions.
18
19**NOTE:** `busybox ash` is currently used to evaluate APKBUILDs since it
20supports additional POSIX shell extensions your APKBUILD might be
21evaluated correctly even if it is not confirming to this policy
22document.
23
24# Shell Style Considerations
25
26<!--
27This should be in conformance with most existing APKBUILDs
28Structure and content inspired by Google Shell Style Guide.
29-->
30
31## Formatting
32
33### Indention
34
35Indent with tabs, don't use spaces. Avoid whitespaces.
36
37### Line Length
38
39Maximum line length is 80 characters, this should be considered a
40recommendation and not a strict requirement which must be followed at
41all costs. Most notably, automatically generated parts (e.g. by `abuild
42checksum`) are except from this rule.
43
44### Compound Statements
45
46Put `; do` and `; then` on the same line as the `while`, `for` or `if`.
47
48### Function Declarations
49
50* Always put the function name, the parenthesis and the curly brackets
51 on the same line.
52* Don't use spacing between function name and parenthesis.
53* Do use spacing between function parenthesis and curly brackets.
54
55### Case statement
56
57* Don't indent alternatives.
58* A one-line alternative needs a space after the close parenthesis of the pattern and before the `;;`.
59* End the last case with `;;`.
60
61### Variable expansion
62
63* Use `${var}` over `$var` only when it is strictly necessary. Meaning:
64 Only if the character following the [variable name][POSIX.1-2017 definition name]
65 is an underscore or an alphanumeric character.
66
67### Quoting
68
69* Always quote string literals (exceptions are assigning `pkgname` and
70 `pkgver`, more on this below).
71* Always quote variables, command substitutions or shell meta characters
72 when used in strings. Prefer `"$var"/foo/bar` over `"$var/foo/bar"`.
73* Never quote literal integers.
74
75## Features
76
77### Command Substitution
78
79* Always use `$()` instead of backticks.
80
81### Test and [
82
83* Prefer `[` over `test(1)`.
84
85## Naming Conventions
86
87### Function Names
88
89* Lower-case, with underscores to separate words. Prefix all helper
90 functions with an underscore character.
91
92### Variable Names
93
94* Lower-case, with underscores to separate words. Prefix all
95 non-metadata variables with an underscore character.
96
97### Use Local Variables
98
99* Declare function-specific variables with the `local` keyword.
100
101## Calling Commands
102
103### Command Substitutions and Global Variables
104
105* Avoid command Substitutions in global variables, use parameter
106 expansions instead.
107
108### Return Values
109
110* APKBUILDs are executed with `set -e`, explicit `|| return 1`
111 statements must not be used.
112
113## Comments
114
115### Spacing
116
117* All comments begin with an ASCII space character, e.g. `# foo`.
118
119### TODO Comments
120
121* Use TODO comments for code that is temporary, a short-term solution,
122 or good-enough but not perfect.
123
124# APKBUILD style considerations
125
126<!--
127This section attempts to document policies enforced by the linter from
128atools <https://github.com/maxice8/atools>, newapkbuild and existing
129APKBUILDs.
130-->
131
132## Comments
133
134### Contributor Comment
135
136* All APKBUILDs begin with one or more contributor comments (one per
137 line) containing a valid [RFC 5322][RFC 5322] address. For example,
138 `# Contributor: Max Mustermann <[email protected]>`.
139
140### Maintainer Comment
141
142* All APKBUILDs contain exactly one maintainer comment containing a
143 valid RFC 5322 address. For example, `# Maintainer: Max Mustermann
144 <[email protected]>`.
145* In addition to a Maintainer Comment a Contributor Comment must be
146 present for said Maintainer.
147
148## Metadata Variables
149
150Metadata Variables are variables used directly by abuild itself, e.g. `pkgname` or `depends`.
151
152### Metadata Values
153
154* `pkgname` must only contain lowercase characters.
155* `pkgname` must match the name of the directory the `APKBUILD` file is located in.
156
157### Variable Assignments
158
159* Empty Metadata Variable assignments, e.g. `install=""` must be removed.
160* The Metadata Variable `builddir` defaults to `$srcdir/$pkgname-$pkgver`
161 and should only be assigned if the default values is not appropriate.
162
163### Assignment Order
164
165* All Metadata Variables (except checksums) must be declared before the
166 first function declaration.
167* Checksum Metadata Variables must be declared after the last function
168 declaration, `abuild checksum` will automatically take care of this.
169
170## Build Functions
171
172### Function Declaration
173
174* Functions should be declared in the order they are called by abuild.
175* All functions are executed in `"$builddir"` explicit directory changes
176 to `$builddir` must be avoided (if possible).
177* Variables local to functions must always be declared with the `local`
178 keyword.
179
180### Function Overwriting
181
182* If the `prepare` function is overwritten it should always call
183 `default_prepare`.
184
185[POSIX.1-2017 volume 3]: https://pubs.opengroup.org/onlinepubs/9699919799/idx/xcu.html
186[POSIX.1-2017 parameter expansion]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02
187[POSIX.1-2017 definition name]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_235
188[bash functions]: https://www.gnu.org/software/bash/manual/bash.html#Shell-Functions
189[bash expansion]: https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion
190[RFC 5322]: https://tools.ietf.org/html/rfc5322