aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/pt-br/books/porters-handbook/plist/chapter.adoc
blob: 7dc7c5c089266d959673788e16a2d907e2715168 (plain) (blame)
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
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
---
title: Capítulo 8. Prácticas Avançadas de [.filename]#pkg-plist#
prev: books/porters-handbook/flavors
next: books/porters-handbook/pkg-files
---

[[plist]]
= Prácticas Avançadas de [.filename]#pkg-plist#
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 8
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[plist-sub]]
== Alterando o [.filename]#pkg-plist# Baseado em Variáveis Make

Alguns ports, particularmente os `p5-` ports, precisam mudar seus [.filename]#pkg-plist# dependendo de quais opções eles são configurados com (ou versão de `perl`, no caso de `p5-` ports). Para tornar isso fácil, todas as instâncias [.filename]#pkg-plist# de `%%OSREL%%`, `%%PERL_VER%%` e `%%PERL_VERSION%%` serão substituídas apropriadamente. O valor de `%%OSREL%%` é a revisão numérica do sistema operacional (por exemplo,`4.9`). `%%PERL_VERSION%%` e `%%PERL_VER%%` é o número completo da versão `perl` (por exemplo,`5.8.9`). Muitos outros `%%_VARS_%%` relacionados aos arquivos de documentação do port são descritos na <<install-documentation,seção relevante>>.

Para fazer outras substituições, defina `PLIST_SUB` com uma lista de pares `_VAR_=_VALOR_` e as instâncias de `%%_VAR_%%` serão substituídas por _VALOR_ no [.filename]#pkg-plist#.

Por exemplo, se um port instalar muitos arquivos em um subdiretório específico da versão, use um placeholder para a versão de modo que o [.filename]#pkg-plist# não precise ser gerado novamente toda vez que o port é atualizado. Por exemplo:

[.programlisting]
....
OCTAVE_VERSION=	${PORTREVISION}
PLIST_SUB=	OCTAVE_VERSION=${OCTAVE_VERSION}
....

no [.filename]#Makefile# e use `%%OCTAVE_VERSION%%` onde quer que a versão apareça em [.filename]#pkg-plist#. Quando o port é atualizado, não será necessário editar dezenas (ou em alguns casos, centenas) de linhas no [.filename]#pkg-plist#.

Se os arquivos são instalados condicionalmente pelas opções definidas no port, a maneira usual de lidar com isso é prefixando as linhas [.filename]#pkg-plist# com `%%OPT%%` para linhas necessárias quando a opção está ativada ou `%%NO_OPT%%` quando a opção está desativada e adicionando `OPTIONS_SUB=yes` ao [.filename]#Makefile#. Veja <<options_sub>> para mais informações.

Por exemplo, se houver arquivos que são instalados apenas quando a opção `X11` está ativada, e o [.filename]#Makefile# tem:

[.programlisting]
....
OPTIONS_DEFINE=	X11
OPTIONS_SUB=	yes
....

No [.filename]#pkg-plist#, insira `%%X11%%` no início das linhas que serão instaladas apenas quando a opção estiver habilitada, assim:

[.programlisting]
....
%%X11%%bin/foo-gui
....

Esta substituição será feita entre os targets `pre-install` e `do-install`, lendo a partir do [.filename]#PLIST# e escrevendo em [.filename]#TMPPLIST# (padrão:[.filename]##WRKDIR/.PLIST.mktmp##). Então, se o port gera o [.filename]#PLIST# na hora da compilação, faça isso em ou antes do `pre-install`. Além disso, se o port precisar editar o arquivo resultante, faça-o em `post-install` em um arquivo chamado [.filename]#TMPPLIST#.

Outra maneira de modificar a lista de empacotamento de um port é baseada na configuração das variáveis `PLIST_FILES` e `PLIST_DIRS`. O valor de cada variável é considerado como uma lista de nomes de caminho para gravar no [.filename]#TMPPLIST# junto com conteúdo do [.filename]#PLIST#. Enquanto os nomes listados no `PLIST_FILES` e `PLIST_DIRS` estão sujeitos a substituição do `%%_VAR_%%` conforme descrito acima, é melhor usar o `${_VAR_}` diretamente. Exceto por isso, os nomes contidos no `PLIST_FILES` aparecerão inalterados na lista final de packing, enquanto o `@dir` será anexado aos nomes do `PLIST_DIRS`. Para fazer efeito, o `PLIST_FILES` e o `PLIST_DIRS` devem ser definidos antes que o [.filename]#TMPPLIST# seja escrito, isto é, no `pre-install` ou antes.

De vez em quando, usar `OPTIONS_SUB` não é o suficiente. Nesses casos, adicionar uma `_TAG_` para `PLIST_SUB` dentro do [.filename]#Makefile# com um valor especial `@comment`, faz as ferramentas de pacote ignorar a linha. Por exemplo, se alguns arquivos são instalados apenas quando a opção `X11` está habilitada e a arquitetura é `i386`:

[.programlisting]
....
.include <bsd.port.pre.mk>

.if ${PORT_OPTIONS:MX11} && ${ARCH} == "i386"
PLIST_SUB+=	X11I386=""
.else
PLIST_SUB+=	X11I386="@comment "
.endif
....

[[plist-cleaning]]
== Diretórios Vazios

[[plist-dir-cleaning]]
=== Limpando Diretórios Vazios

Ao ser desinstalado, um port deve remover os diretórios vazios que ele criou. A maioria desses diretórios são removidos automaticamente pelo man:pkg[8], mas para os diretórios criados fora do [.filename]#${PREFIX}#, ou diretórios vazios, mais alguns passos precisam ser feitos. Isso geralmente é realizando adicionando entradas `@dir` para esses diretórios.Os subdiretórios devem ser excluídos antes de excluir os diretórios pai.

[.programlisting]
....
[...]
@dir /var/games/oneko/saved-games
@dir /var/games/oneko
....

[[plist-dir-empty]]
=== Criando Diretórios Vazios

Os diretórios vazios criados durante a instalação do port precisam de atenção especial. Eles devem estar presentes quando o pacote é criado. Se eles não forem criados pelo código do port, crie-os no [.filename]#Makefile#:

[.programlisting]
....
post-install:
	${MKDIR} ${STAGEDIR}${PREFIX}/some/directory
....

Adicione o diretório ao [.filename]#pkg-plist# como qualquer outro. Por exemplo:

[.programlisting]
....
@dir some/directory
....

[[plist-config]]
== Arquivos de Configuração

Se o port instalar arquivos de configuração em [.filename]#PREFIX/etc# (ou em outro lugar) _não_ liste-os em [.filename]#pkg-plist#. Isso fará com que `pkg delete` remova os arquivos que foram cuidadosamente editados pelo usuário, e uma reinstalação irá eliminá-los.

Em vez disso, instale arquivos de exemplo com uma extensão [.filename]#filename.sample#. A macro `@sample` automatiza isso, consulte <<plist-keywords-sample>> para entender o que ela faz exatamente. Para cada arquivo de exemplo, adicione uma entrada no [.filename]#pkg-plist#:

[.programlisting]
....
@sample etc/orbit.conf.sample
....

Se houver uma boa razão para não instalar um arquivo de configuração por padrão, liste apenas o nome do arquivo de exemplo em [.filename]#pkg-plist#, sem o `@sample` seguido por um espaço e adicione uma <<porting-message,mensagem>> ressaltando que o usuário deve copiar e editar o arquivo antes que o software seja executado.

[TIP]
====
Quando um port instala sua configuração em um subdiretório de [.filename]#${PREFIX}/etc#, usar `ETCDIR`, cujo padrão é `${PREFIX}/etc/${PORTNAME}`, pode ser substituído nos [.filename]#Makefile# dos ports se houver uma convenção para o port usar algum outro diretório. A macro `%%ETCDIR%%` será usado em seu lugar em [.filename]#pkg-plist#.
====

[NOTE]
====
Os arquivos de configuração de exemplo devem sempre ter o sufixo [.filename]#.sample#. Se, por algum motivo histórico, o uso do sufixo padrão não for possível ou se os arquivos de exemplo vierem de algum outro diretório, use esta construção:

[.programlisting]
....
@sample etc/orbit.conf-dist etc/orbit.conf
....

ou

[.programlisting]
....
@sample %%EXAMPLESDIR%%/orbit.conf etc/orbit.conf
....

O formato é `@sample sample-file actual-config-file`.
====

[[plist-dynamic]]
== Lista de Pacotes Estática versus Dinâmica

Uma _lista de pacotes estáticos_ é uma lista de pacotes que está disponível na Coleção de Ports ou como [.filename]#pkg-plist# (com ou sem substituição de variável), ou embutido no [.filename]#Makefile# através do `PLIST_FILES` e do `PLIST_DIRS`. Mesmo se o conteúdo for gerado automaticamente por uma ferramenta ou um taget no Makefile _antes_ da inclusão na Coleção de Ports por um committer (por exemplo, usando `make makeplist`), isso ainda é considerado uma lista estática, já que é possível examiná-la sem ter que baixar ou compilar o distfile.

Uma _lista de pacotes dinâmicos_ é uma lista de pacotes que é gerada no momento em que o port é compilado com base nos arquivos e diretórios que estão instalados. Não é possível examiná-lo antes que o código-fonte do aplicativo portado seja baixado e compilado, ou após executar um `make clean`.

Embora o uso de listas de pacotes dinâmicos não seja proibido, os mantenedores devem usar listas de pacotes estáticos sempre que possível, já que isso permite aos usuários utilizar man:grep[1] nos de ports disponíveis para descobrir, por exemplo, qual port instala um determinado arquivo. Listas dinâmicas devem ser usadas principalmente para ports complexos onde a lista de pacotes muda drasticamente com base nos recursos opcionais do port (e assim manter uma lista de pacotes estática é impraticável), ou ports que alteram a lista de pacotes com base na versão do software dependente usado. Por exemplo, ports que geram documentos com Javadoc.

[[plist-autoplist]]
== Criação Automatizada da Lista de Pacotes

Primeiro, verifique se o port está quase completo, faltando apenas o [.filename]#pkg-plist#. Executar o comando `make makeplist` irá mostrar um exemplo para o [.filename]#pkg-plist#. A saída do `makeplist` deve ser checada duas vezes quanto à correção, pois ela tenta adivinhar automaticamente algumas coisas e pode errar.

Os arquivos de configuração do usuário devem ser instalados como [.filename]#filename.sample#, como é descrito em <<plist-config>>. O [.filename]#info/dir# não deve ser listado e entradas apropriadas [.filename]#install-info# devem ser adicionadas conforme a seção <<makefile-info,arquivos de informação>>. Quaisquer bibliotecas instaladas pelo port devem ser listadas conforme especificado na seção <<porting-shlibs,bibliotecas compartilhadas>>.

[[plist-autoplist-regex]]
=== Expansão do `PLIST_SUB` com Expressões Regulares

As strings a serem substituídas às vezes precisam ser muito específicas para evitar substituições indesejadas. Esse é um problema comum com valores mais curtos.

Para resolver este problema, para cada `PLACEHOLDER=value`, um `PLACEHOLDER_regex =regex` pode ser definido, com o _regex_ do `_value_` correspondendo mais precisamente.

[[plist-autoplist-regex-ex1]]
.Usando PLIST_SUB com Expressões Regulares
[example]
====
Os ports Perl podem instalar arquivos dependentes da arquitetura em uma árvore específica. No FreeBSD para facilitar a portabilidade, esta árvore é chamada de `mach`. Por exemplo, um port que instala um arquivo cujo caminho contém `mach` poderia ter essa parte da sequência do caminho substituída pelos valores incorretos. Considere este [.filename]#Makefile#:

[.programlisting]
....
PORTNAME=	Machine-Build
DISTVERSION=	1
CATEGORIES=	devel perl5
MASTER_SITES=	CPAN
PKGNAMEPREFIX=	p5-

MAINTAINER=	perl@FreeBSD.org
COMMENT=	Building machine

USES=		perl5
USE_PERL5=	configure

PLIST_SUB=	PERL_ARCH=mach
....

Os arquivos instalados pelo port são:

[.programlisting]
....
/usr/local/bin/machine-build
/usr/local/lib/perl5/site_perl/man/man1/machine-build.1.gz
/usr/local/lib/perl5/site_perl/man/man3/Machine::Build.3.gz
/usr/local/lib/perl5/site_perl/Machine/Build.pm
/usr/local/lib/perl5/site_perl/mach/5.20/Machine/Build/Build.so
....

Executar o `make makeplist` gera incorretamente:

[.programlisting]
....
bin/%%PERL_ARCH%%ine-build
%%PERL5_MAN1%%/%%PERL_ARCH%%ine-build.1.gz
%%PERL5_MAN3%%/Machine::Build.3.gz
%%SITE_PERL%%/Machine/Build.pm
%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so
....

Altere a linha `PLIST_SUB` do [.filename]#Makefile# para:

[.programlisting]
....
PLIST_SUB=	PERL_ARCH=mach \
		PERL_ARCH_regex=\bmach\b
....

Agora o `make makeplist` gera corretamente:

[.programlisting]
....
bin/machine-build
%%PERL5_MAN1%%/machine-build.1.gz
%%PERL5_MAN3%%/Machine::Build.3.gz
%%SITE_PERL%%/Machine/Build.pm
%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so
....

====

[[plist-keywords]]
== Expandindo a Lista de Pacotes com Keywords

Todas as keywords também podem ter argumentos opcionais entre parênteses. Os argumentos são owner, group e mode. Esse argumento é usado no arquivo ou diretório referenciado. Para alterar o dono, o grupo e o modo de um arquivo de configuração, use:

[.programlisting]
....
@sample(games,games,640) etc/config.sample
....

Os argumentos são opcionais. Se apenas o grupo e o modo precisarem ser alterados, use:

[.programlisting]
....
@sample(,games,660) etc/config.sample
....

[WARNING]
====

Se uma keyword for utilizada em uma entrada de <<makefile-options,opção>>, ela precisa ser adicionada após o assistente:

[.programlisting]
....
%%FOO%%@sample etc/orbit.conf.sample
....

Isso é porque os assistentes plist das opções são utilizados para comentar as linhas, e por isso eles precisam ser inseridos no início. Veja <<options_sub>> para maiores informações.
====

[[plist-keywords-desktop-file-utils]]
=== `@desktop-file-utils`

Irá executar o `update-desktop-database -q` após a instalação e desinstalação. _Nunca_ use diretamente, adicione <<uses-desktop-file-utils,`USES=utilitários de arquivo de desktop`>> ao [.filename]#Makefile#.

[[plist-keywords-fc]]
=== `@fc` _directory_

Adiciona uma entrada `@dir` para o diretório passado como um argumento, e executa `fc-cache -fs` nesse diretório após a instalação e desinstalação.

[[plist-keywords-fcfontsdir]]
=== `@fcfontsdir` _directory_

Adiciona uma entrada `@dir` para o diretório passado como um argumento, e executa `fc-cache -fs`, `mkfontscale` e `mkfontdir` nesse diretório após a instalação e desinstalação. Além disso, na desinstalação, ele remove os arquivos de cache [.filename]#fonts.scale# e [.filename]#fonts.dir#, se estiverem vazios. Esta keyword é equivalente a adicionar o diretório <<plist-keywords-fc,``@fc``>> e o diretório <<plist-keywords-fontsdir,``@fontsdir``>>.

[[plist-keywords-fontsdir]]
=== `@fontsdir` _directory_

Adiciona um entrada `@dir` para o diretório passado como um argumento, e executa `mkfontscale` e `mkfontdir` nesse diretório após a instalação e desinstalação. Além disso, na desinstalação, ele remove os arquivos de cache [.filename]#fonts.scale# e [.filename]#fonts.dir#, se estiverem vazios.

[[plist-keywords-glib-schemas]]
=== `@glib-schemas`

Executa `glib-compile-schemas` na instalação e desinstalação.

[[plist-keywords-info]]
=== `@info` _file_

Adiciona o arquivo passado como argumento ao plist e atualiza o índice do documento info na instalação e desinstalação. Além disso, ele remove o índice se estiver vazio na desinstalação. Isso nunca deve ser usado manualmente, mas sempre `INFO`. Veja <<makefile-info>> para maiores informações.

[[plist-keywords-kld]]
=== `@kld` _directory_

Executa o `kldxref` no diretório na instalação e desinstalação. Além disso, na desinstalação, ele removerá o diretório se estiver vazio.

[[plist-keywords-rmtry]]
=== `@rmtry` _file_

O arquivo será removido na desinstalação, e não dará um erro se o arquivo não estiver lá.

[[plist-keywords-sample]]
=== `@sample` __file__[__file__]

Isso é usado para lidar com a instalação de arquivos de configuração, através de arquivos de exemplo empacotados com o pacote. O arquivo "atual", não-amostra, ou é o segundo nome do arquivo, se presente, ou o primeiro nome de arquivo sem a extensão [.filename]#.sample#.

Isso faz três coisas. Primeiro, adiciona o primeiro arquivo passado como argumento, o arquivo de exemplo, ao plist. Então, na instalação, se o arquivo real não for encontrado, copia o arquivo de exemplo para o arquivo real. E, finalmente, na desinstalação, remove o arquivo atual se ele não tiver sido modificado. Veja <<plist-config>> para maiores informações.

[[plist-keywords-shared-mime-info]]
=== `@shared-mime-info` _directory_

Executa `update-mime-database` no diretório na instalação e desinstalação.

[[plist-keywords-shell]]
=== `@shell` _file_

Adiciona o arquivo passado como argumento ao plist.

Na instalação, adiciona o caminho completo do _file_ em [.filename]#/etc/shells#, certificando-se que não é adicionado duas vezes. Na desinstalação, remove-o de [.filename]#/etc/shells#.

[[plist-keywords-terminfo]]
=== `@terminfo`

Não use sozinho. Se o port for instalar arquivos [.filename]#*.terminfo#, adicione <<uses-terminfo,USES=terminfo>> no seu [.filename]#Makefile#.

Na instalação e desinstalação, se o `tic` estiver presente, atualize o [.filename]#${PREFIX}/shared/misc/terminfo.db# a partir dos arquivos [.filename]#*.terminfo# disponíveis em [.filename]#${PREFIX}/shared/misc#.

[[plist-keywords-base]]
=== Keywords Básicas

Existem algumas keywords que são codificadas e documentadas em man:pkg-create[8]. Por uma questão de completude, elas também estão documentadas aqui.

[[plist-keywords-base-empty]]
==== `@` [__file__]

A keyword vazia é um espaço reservado para ser usado quando o proprietário, grupo ou modo do arquivo precisam ser alterados. Por exemplo, para definir o grupo de um arquivo como `games` e adicionar o bit setgid, adicione:

[.programlisting]
....
@(,games,2755) sbin/daemon
....

[[plist-keywords-base-exec]]
==== `@preexec` _command_, `@postexec` _command_, `@preunexec` _command_, `@postunexec` _command_

Executa o _command_ como parte do processo de instalação ou desinstalação.

`@preexec` _command_::
Executar o _command_ como parte dos scripts [.filename]#pre-install#.

`@postexec` _command_::
Executar o _command_ como parte dos scripts [.filename]#post-install#.

`@preunexec` _command_::
Executar o _command_ como parte dos scripts [.filename]#pre-deinstall#.

`@postunexec` _command_::
Executar o _command_ como parte dos scripts [.filename]#post-deinstall#.

E se o _command_ contém qualquer uma dessas sequências em algum lugar, elas são expandidas em linha. Para estes exemplos, assuma que `@cwd` está configurado para [.filename]#/usr/local# e o último arquivo extraído foi [.filename]#bin/emacs#.

`%F`::
Expandir para o último nome de arquivo extraído (conforme especificado). No caso do exemplo [.filename]#bin/emacs#.

`%D`::
Expandir para o prefixo do diretório atual, como definido no `@cwd`. No caso do exemplo [.filename]#/usr/local#.

`%B`::
Expandir para o nome de base do nome completo do arquivo, ou seja, o prefixo do diretório atual mais o último arquivo, menos o nome do arquivo final. No exemplo, isso seria [.filename]#/usr/local/bin#.

`%f`::
Expandir para a parte do nome do arquivo do nome totalmente qualificado, ou o inverso de `%B`. No caso do exemplo, [.filename]#emacs#.

[IMPORTANT]
====
Essas keywords estão aqui para ajudá-lo a configurar o pacote para que ele esteja tão pronto quanto possível. Elas _não devem_ ser abusadas para iniciar serviços, interromper serviços ou executar quaisquer outros comandos que modificarão o sistema em execução.
====

[[plist-keywords-base-mode]]
==== `@mode` _mode_

Define a permissão padrão para todos os arquivos extraídos posteriormente para _mode_. O formato é o mesmo usado por man:chmod[1]. Use sem um argumento para voltar às permissões padrão (modo do arquivo enquanto estava sendo empacotado).

[IMPORTANT]
====
Este deve ser um modo numérico, como `644`, `4755` ou `600`. Não pode ser um modo relativo como `u+s`.
====

[[plist-keywords-base-owner]]
==== `@owner` _user_

Define a propriedade padrão para todos os arquivos subsequentes para _user_. Use sem um argumento para voltar à propriedade padrão (`root`).

[[plist-keywords-base-group]]
==== `@group` _group_

Define a propriedade de grupo padrão para todos os arquivos subsequentes para _group_. Use sem um argumento para retornar à propriedade do grupo padrão (`wheel`).

[[plist-keywords-base-comment]]
==== `@comment` _string_

Esta linha é ignorada no momento de empacotar.

[[plist-keywords-base-dir]]
==== `@dir` _directory_

Declara o nome do diretório. Por padrão, os diretórios criados sob `PREFIX` por uma instalação de pacote são automaticamente removidos. Use isto quando um diretório vazio sob `PREFIX` precisa ser criado ou quando o diretório precisa ter proprietário, grupo ou modo não padrão. Diretórios fora de `PREFIX` precisam ser registrados. Por exemplo, [.filename]#/var/db/${PORTNAME}# precisa ter uma entrada `@dir` enquanto [.filename]#${PREFIX}/shared/${PORTNAME}# não, se contiver arquivos ou usar o proprietário, grupo e modo padrão.

[[plist-keywords-base-exec-deprecated]]
==== `@exec` _command_, `@unexec` _command_ (Descontinuado)

Executa o _command_ como parte do processo de instalação ou desinstalação. Por favor, use <<plist-keywords-base-exec>> no lugar.

[[plist-keywords-base-dirrm]]
==== `@dirrm` _directory_ (Descontinuado)

Declara o nome do diretório a ser excluído na desinstalação. Por padrão, os diretórios criados sob `PREFIX` por uma instalação de pacote são excluídos quando o pacote é desinstalado.

[[plist-keywords-base-dirrmtry]]
==== `@dirrmtry` _directory_ (Descontinuado)

Declara o nome do diretório a ser removido, como para a keyword `@dirrm`, mas não emite um aviso se o diretório não puder ser removido.

[[plist-keywords-creating-new]]
=== Criando Novas Keywords

Os arquivos da lista de pacotes podem ser estendidos por keywords definidas no diretório [.filename]#${PORTSDIR}/Keywords#. As configurações de cada keyword são armazenadas em um arquivo UCL chamado [.filename]#keyword.ucl#. O arquivo deve conter pelo menos uma destas seções:

* `attributes`
* `action`
* `pre-install`
* `post-install`
* `pre-deinstall`
* `post-deinstall`
* `pre-upgrade`
* `post-upgrade`

[[plist-keywords-attributes]]
==== `attributes`

Altera o dono, grupo ou modo usado pela keyword. Contém uma matriz associativa em que as chaves possíveis são `owner`, `group` e `mode`. Os valores são, respectivamente, um nome de usuário, um nome de grupo e um modo de arquivo. Por exemplo:

[.programlisting]
....
attributes: { owner: "games", group: "games", mode: 0555 }
....

[[plist-keywords-action]]
==== `action`

Define o que acontece com o parâmetro da keyword. Contém uma matriz onde os valores possíveis são:

`setprefix`::
Define o prefixo para as próximas entradas do plist.

`dir`::
Registra um diretório para ser criado na instalação e removido na desinstalação.

`dirrm`::
Registra um diretório a ser excluído na desinstalação. Descontinuado.

`dirrmtry`::
Registra um diretório para tentar deletar na desinstalação. Descontinuado.

`file`::
Registra um arquivo.

`setmode`::
Define o modo para as próximas entradas do plist.

`setowner`::
Define o dono para as próximas entradas do plist.

`setgroup`::
Define o grupo para as próximas entradas do plist.

`comment`::
Não faz nada, é o equivalente a não entrar em uma seção `action`.

`ignore_next`::
Ignora a próxima entrada no plist.

[[plist-keywords-arguments]]
==== `arguments`

Se definido para `true`, adiciona manipulação de argumentos, dividindo toda a linha, `%@`, em argumentos numerados,`%1`, `%2`, e assim por diante. Por exemplo, para esta linha:

[.programlisting]
....
@foo some.content other.content
....

`%1` e `%2` irão conter:

[.programlisting]
....
some.content
other.content
....

Também afeta como a entrada <<plist-keywords-action,`action`>> funciona. Quando há mais de um argumento, o número do argumento deve ser especificado. Por exemplo:

[.programlisting]
....
actions: [file(1)]
....

[[plist-keywords-pre-post]]
==== `pre-install`, `post-install`, `pre-deinstall`, `post-deinstall`, `pre-upgrade`, `post-upgrade`

Essas keywords contêm um script man:sh[1] a ser executado antes ou depois da instalação, desinstalação, ou atualização do pacote. Além do habitual placeholder `@exec %foo` descrito em <<plist-keywords-base-exec>>, há um novo `%@`, que representa o argumento da keyword.

[[plist-keywords-examples]]
==== Exemplos de Keywords Customizadas

[[plist-keywords-fc-example]]
.Exemplo de uma Keyword `@dirrmtryecho`
[example]
====
Esta keyword faz duas coisas, adiciona uma linha `@dirrmtry _directory_` na lista de empacotamento, e escreve no log quando o diretório é removido ao desinstalar o pacote.

[.programlisting]
....
actions: [dirrmtry]
post-deinstall: <<EOD
  echo "Directory %D/%@ removed."
EOD
....

====

[[plist-keywords-sample-example]]
.Exemplo na vida real, como o `@sample` é implementado
[example]
====
Esta keyword faz três coisas. Ela adiciona o primeiro _filename_ passado como um argumento para `@sample` na lista de empacotamento, ele adiciona instruções ao script de `post-install` para copiar o exemplo para o arquivo de configuração real, se ele ainda não existir, e adiciona instruções ao script `post-deinstall` para remover o arquivo de configuração se ele não tiver sido modificado.

[.programlisting]
....
actions: [file(1)]
arguments: true
post-install: <<EOD
  case "%1" in
  /*) sample_file="%1" ;;
  *) sample_file="%D/%1" ;;
  esac
  target_file="${sample_file%.sample}"
  set -- %@
  if [ $# -eq 2 ]; then
      target_file=${2}
  fi
  case "${target_file}" in
  /*) target_file="${target_file}" ;;
  *) target_file="%D/${target_file}" ;;
  esac
  if ! [ -f "${target_file}" ]; then
    /bin/cp -p "${sample_file}" "${target_file}" && \
      /bin/chmod u+w "${target_file}"
  fi
EOD
pre-deinstall: <<EOD
  case "%1" in
  /*) sample_file="%1" ;;
  *) sample_file="%D/%1" ;;
  esac
  target_file="${sample_file%.sample}"
  set -- %@
  if [ $# -eq 2 ]; then
      set -- %@
      target_file=${2}
  fi
  case "${target_file}" in
  /*) target_file="${target_file}" ;;
  *) target_file="%D/${target_file}" ;;
  esac
  if cmp -s "${target_file}" "${sample_file}"; then
    rm -f "${target_file}"
  else
    echo "You may need to manually remove ${target_file} if it is no longer needed."
  fi
EOD
....

====