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
|
Package Manager
===============
In Alice, two package manager are used, [spm](https://codeberg.org/emmett1/spm) and [autils](https://codeberg.org/emmett1/autils). And why two package manager? `spm` was written for generic package manager for linux distribution. And `autils` is written specifically for `Alice` and requires `spm` in order to install, remove and update packages while managing conflicts. The command `apkg` (part of `autils`) is used to fetch and build packages from ports and their `abuild` files.
spm
---
`spm` stands for `simple package manager`. It does simple and minimal written in POSIX compliance shell script. It only depends on core utils and tar (or busybox's utils and tar). `spm` only intended for compressing some directory into package, then extract package into system with files being tracked into database. There is no build script, recipe or ports in `spm`. You can write your own tools to use with `spm` either like Arch Linux's `makepkg`, CRUX's `pkgmk` or Slackware's `slackbuild` script.
spm - usage
-----------
list `spm` usage:
```
-a print all installed packages
-b <path> build <path> directory into package
-h print this help message
-i <file> install <file> package into system
-l <pkg> list files installed by <pkg>
-o <file> print owner of <file>
-r <name> remove installed <name> from system
-u <pkg> re-install/upgrade <pkg>
```
list all install package with version:
```
$ spm -a
...
neofetch 7.1.0-1
nettle 3.10-1
nghttp2 1.62.1-1
ninja 1.12.1-1
nodejs 22.5.1-1
nspr 4.35-1
nss 3.102.1-1
nsxiv 32-1
...
```
build package from directory:
```
(build package)
$ ./configure --prefix=/usr
$ make
(install into fake directory)
$ make DESTDIR=$PWD/fakeroot install
(turn fake directory into package (package.spm))
# spm -b $PWD/fakeroot
(mv 'package.spm' into correct format (name#version-release.spm))
# mv package.spm pkgname#pkgversion-pkgrelease.spm
(install package into system)
# spm -i pkgname#pkgversion-pkgrelease.spm
```
install package into system:
```
# spm -i pkgname#pkgversion-pkgrelease.spm
[pkgname] Verify package...
[pkgname] Checking for conflicts...
[pkgname] Installing package...
[pkgname] Package 'pkgname#pkgversion-pkgrelease' installed.
```
list files installed by 'packagename'$ spm -l test:
```
usr/
usr/share/
usr/share/aaa
usr/bin/
usr/bin/aaa
```
list package owner of a file (can use regex):
```
$ spm -o gcc$
ccache usr/lib/ccache/gcc
gcc usr/bin/gcc
gcc usr/bin/x86_64-pc-linux-musl-gcc
linux lib/modules/6.6.41-Alice/build/scripts/dummy-tools/gcc
```
upgrade/reinstall installed package:
```
# spm -u pkgname#pkgversion-pkgrelease.spm
[pkgname] Verify package...
[pkgname] Checking for conflicts...
[pkgname] Upgrading package...
[pkgname] Package 'pkgname#pkgversion-pkgrelease' upgraded.
```
spm - environment
-----------------
```
SPM_ROOT: use custom root location for package installation
SPM_FORCEINSTALL: set any value to ignore conflicted files
```
You can pass these environment to `spm` command, example:
```
# SPM_ROOT=/mnt/rootfs spm -i pkgname#pkgversion-pkgrelease.spm
# SPM_FORCEINSTALL=1 SPM_ROOT=/mnt/rootfs spm -i pkgname#pkgversion-pkgrelease.spm
```
autils
------
`autils` stands for `alice utilitis`. `autils` contains main package manager (apkg), utilities (apkg-<util>) and <random util script>. `autils` is specifically written to manage `Alice` packages.
apkg
----
`apkg` is a main package manager that can solve dependencies, batch install/upgrade/remove packages, system upgrades, trigger necessary caches, and etc. `apkg` can be run inside or outside package template.
When running outside package template, `apkg` will need 'package names' as arguments, and those 'package names' will search through `APKG_REPO` environment. Example:
```
# apkg testpkg testpkg2 (build testpkg and testpkg2)
# apkg testpkg testpkg2 -i (build and install testpkg and testpkg2)
# apkg -u testpkg testpkg2 (upgrade/reinstall testpkg and testpkg2)
# apkg -f -u testpkg testpkg2 (force rebuild then upgrade/reinstall testpkg and testpkg2)
```
When running inside package template, `apkg` will do operation for current directory package. Example:
```
# cd /path/to/local/testpkg
# apkg (build testpkg)
# apkg -i (build and install testpkg)
# apkg -u (upgrade/reinstall testpkg)
# apkg -u -f (force rebuild then upgrade/reinstall testpkg)
```
apkg - usage
------------
```
-i <pkg(s)> install package(s)
-I <pkg(s)> install packages(s) with dependencies
-d <pkg> list <pkg> dependencies
-D <pkg(s)> list all dependencies
-j <pkg> list all dependents
-u <pkg(s)> upgrade package(s)
-t [pkg(s)] trigger system cache/db updates
-U update system
-f force rebuild
-o <pkg(s)> download source
-p <pkg> print package path
-s <pattern> search packages
-h print this help message
```
I won't explain details on every each options here, but I will give quick tips/tricks to use `apkg`
installing package and its dependencies (mind the uppercase `i`):
```
# apkg -I sway
[...] Solving dependencies...
[...] Installing 3 package(s): mesa pango sway
[...] Press ENTER to continue operation.
[...] Press Ctrl + C to abort.
```
search available packages:
```
$ apkg -s sway
swaybg
swaylock
sway
swayidle
swayfx
```
install all package with 'sway' name and its dependencies:
```
# apkg -I $(apkg -s sway)
...
[...] Package 'mesa' is installed
[...] Package 'swaybg' is installed
[...] Package 'swaylock' is installed
[...] Package 'swayidle' is installed
[...] Package 'swayfx' is installed
[...] Solving dependencies...
[...] Installing 2 package(s): pango sway
[...] Press ENTER to continue operation.
[...] Press Ctrl + C to abort.
```
install package without solving dependencies (mind the lowercase `i` and the absence prompt for this option):
```
# apkg -i wlroots mesa
[...] Package 'wlroots' already installed.
[...] Package 'mesa' already installed.
```
list all installed packages:
```
$ apkg -a
...
qemu
ranger
rdfind
readline
rsync
rtorrent
rust
...
```
list all installed packages with filter (will only print installed package contains word filter):
```
$ apkg -a sway
swaybg
swayfx
swayidle
swaylock
```
list dependencies of a package:
```
$ apkg -d sway
wlroots
json-c
pango
```
list all dependencies tree of package(s):
```
$ apkg -D sway dwm
...
wayland
wayland-protocols
xkeyboard-config
xcb-proto
xorgproto
util-macros
...
```
upgrade/reinstall package(s):
```
# apkg -u wlroots cwm pango
[wlroots] Verify package...
[wlroots] Checking for conflicts...
[wlroots] Upgrading package...
[wlroots] Package 'wlroots#0.17.4-1' upgraded.
[cwm] Verify package...
[cwm] Checking for conflicts...
[cwm] Upgrading package...
[cwm] Package 'cwm#7.4-1' upgraded.
[pango] Verify package...
[pango] Checking for conflicts...
[pango] Upgrading package...
[pango] Package 'pango#1.54.0-1' upgraded.
```
full system upgrades (mind uppercase `u` and will prompt first if there is package updates):
```
# apkg -U
[...] Checking for outdated packages...
[...] Solving dependencies...
[...] Upgrading 3 package(s): initscripts mesa sowm
[...] Press ENTER to continue operation.
[...] Press Ctrl + C to abort.
```
make full system rebuild in dependencies order (`-f`: force rebuild, `-u`: upgrade/reinstall, `-D`: solve dependency order, `-a`: list all installed package(s)):
```
# apkg -f -u $(apkg -D $(apkg -a))
...
(start rebuilding package in dependencies order here)
...
```
remove installed packages:
```
# apkg -r wlroots pango sway
[...] Package 'wlroots' removed.
[...] Package 'pango' removed.
[...] Package 'sway' removed.
```
print package path:
```
$ apkg -p sway
/home/emmett/codeberg/alicelinux/repos/wayland/sway
```
apkg - environment
------------------
You can pass environment to `apkg` to override defaults and in `/etc/apkg.conf`. Available environment and its default value as follows:
```
env default value description
APKG_ROOT / root for package installation
APKG_CONF /etc/apkg.conf apkg's config file
APKG_REPO defaults is empty, template repo path, space separated variable
APKG_PACKAGE_DIR $PWD prebuilt package directory path
APKG_SOURCE_DIR $PWD package source directory path
APKG_WORK_DIR $PWD package working directory path
APKG_NOPROMPT defaults is empty, skip prompt, use any value
```
You can add these environment into `apkg` config file.
/etc/apkg.conf
------------------
`apkg` can work without its config file by using all default value. Default config path for `apkg` is `/etc/apkg.conf`. You can override config path by append `APKG_CONF` to `apkg`, example:
```
# APKG_CONF=/etc/apkg-local.conf apkg <args>
```
revdep
------
`revdep` is script to find broken packages. Its recommended to run after packages is removed or upgraded.
Usage:
```
(print out broken packages)
$ revdep
(verbosely print missing libraries)
$ revdep -v
```
You can combine with `apkg` to rebuild broken packages, example;
```
# apkg -f -u $(revdep)
```
> NOTE: `revdep` does not solve dependencies, so you might need manually rebuild broken packages instead combine with `apkg`.
updateconf
----------
`updateconf` is script to update configuration files inside `/etc` directory. Its recommended to run after packages upgrades.
apkg-chroot
-----------
Script to entering chroot environment of custom root location.
```
# apkg-chroot <customroot path>
# apkg-chroot <customroot path> <command>
```
apkg-clean
----------
Print out old package and source caches.
Options:
```
-s print sources only
-p print packages only
```
Usage:
```
(to remove old packages)
# apkg-clean -p | xargs rm
(to remove old sources)
# apkg-clean -s | xargs rm
(to remove both old packages and sources)
# apkg-clean | xargs rm
```
apkg-deps
---------
Script to find runtime linked dependencies of installed package. Its good to figure out dependencies when writing package template.
Usage:
```
$ apkg-deps <pkg>
```
apkg-foreign
------------
Script to list installed package outside package repo.
Usage:
```
(print list foreign packages)
$ apkg-foreign
(remove foreign packages)
# apkg -r $(apkg-foreign)
```
apkg-orphan
-----------
Script to print list package without parent dependencies.
Usage:
```
$ apkg-orphan
```
apkg-redundantdeps
------------------
Script to print package's redundant dependencies. Its good to use when writing package template for minimizing dependencies and speed up `apkg` dependencies solving.
usage:
```
(print package contains redundant dependencies)
$ apkg-redundantdeps
(remove redundant dependencies for depends list)
$ apkg-redundantdeps -f
```
|