Diretrizes de Empacotamento do Fedora公司

作为圣古玛科勒桑奥的直接教义,我们共同创造了一个伟大的社会。Embora estas orientaçes náo devam ser ignoradas,elas também náo-devem ser cegamente seguidas。这是一个有利于解决问题的解决方案Fedora包装委员会.

Estes documentos cobrem os详细介绍了finos de empacotamento aceitável do Fedora e、embora possam include vários examplos、eles náo seráo specialrmente ou teis como um教程。Eles também náo cobrem os detalhes e políticas relacionas a ober aceso aos repositórios do Fedora como um empacotador,ou a mecánica de criar e lançar pacotes como parte da distribuiço。第二部分:古巴领事馆:

e响应ilidade做审校,做pacote apontar问题,específicos com um pacote e响应iliadade做empacotador激光雷达处理问题。O revisor e O empactador trabalham juntos para determinate a gravidade dos problems(seles bloqueiam um pacote ou podem ser resolvidos deposis que O pacote estiver no repositório)。Lembre-se de que qualquer pacote que vocáenviar também deveestar em conformidade com公司修订目录.

O autor原创女神文档汤姆·卡勒韦,embora eles tenham sido originalmente baseados em muitos outer documentos。修改后的元素对Embalagem委员会来说意义重大。

作为宫殿-保存-DEVE,NÃO DEVE、RECOMENDADO、N \195MENDADO e PODE nessas指导开发-服务-解释-共同描述https://www.rfc-editor.org/rfc/rfc2119欧菲2119]。

将问题描述为直接内容,包括数字错误,阿奎.

适用范围

在过去的一段时间里,这是一个在Fedora生活的过程中,在Fedora生活的过程中(Rawhide)。特别是针对相关类人猿,特别是对其进行了详细的观察。不必担心,观察一下生皮豆荚的快速变化,就像圣维希斯·莱因达的自由市场一样。

作为导演,塔姆贝姆·科布雷姆(também cobrem)在certo ponto,pacotes para EPEL,mas apenas quando combindas com对EPEL进行除污.O pacote Fedora muda muito mais rapidamente do que O pacote EPEL,portanto,como tempo,essas directrizes se afastaráO ainda mais de qualquer versáO EPEL específica e,para versóO EPEL-mais antia e suportada,as differenças podem ser bastante signitivas。作为各方的目的,《圣保罗宣言》(que náo se aplicamáEPEL geramentite náoseráo indicadas)被直接化。

极乐世界

Como estas将nunca poderáo cobrir todas直接定义为contingáncias possíveis,existiráo sempre pacotes que necessitam de excessiones。e responsibilidade do empacotador seguir estas指导了《圣保罗纪录片》(quanto possível documentar claramente)、《科莫科门塔里奥斯无阿基沃规范》(como comentários no arquivo spec do pacote)、《os casos em que elas náo possam ser seguidas》。

Se,em uma diretriz,代表美国农业部,代表viaável que o pacote esteja em conformidade comessa diretris,o empactador pode desviar-Se dela。一个自然的做的desvio e o raciocínio por trás dele DEVEM ser documentados没有arquivo规范。

Quando是usada的一种语言“deve”,“enecesário”ou“precisa”,o empacotador pode desviar-se da diretriz somete com a aprovaáo do comit is de empacatamento。Por favor,siga o procedimento na página doEmpacotamento公司para fazer essas恳求。

二叠纪Pacotes permitios

赞成,修改O que pode ser empacotado(奥克·波德·泽·恩帕科塔多)para garantir que o que vocñ假装没有Fedora的许可证。

命名地

建议将que vocísiga作为命名分类para garantir que seu pacote seja nomado apropriadamente。

凡尔桑·兰萨门托(Versáo e lançamento)

文档Aço que cobre A maneira correta de usar os campos版本e发布pode ser encontrada阿奎.

利琴察(Licenças)

建议将声音修改为信息清醒licenças determinadas como permitidas no Fedora许可证e(电子)Diretrizes de licenças公司para garantir que seu pacote tenha as licenças corretas e estas sejam indicadas corretmente。

Fedora注册商标

Os食蚁兽NÃO开发费多拉注册协会的成员,包括o logotipo do Fedora、i cones do logotipoo Fedora ouáficos que includiam o logotip do Fe多拉、i cone do logoteipo o Fedoraou gráfinicos que inclaam。埃塞斯·阿蒂沃斯开发seradicionados ao pacote软呢帽标志。我们安装了标识,并附上了软帽标识。上游contiver recursos da marca registrationda do Fedora que vocáacredita terem sido usados de forma inadequada,envie um电子邮件段落legal@fedoraproject.org

Isso ocorre porque o logotipo do Fedoraéuma marca registrationda,queétratada sob uma estrutura legal differente do código。Ele deve ser distributuído sob termos que protejam a marca registrationda公司。马卡斯注册后,费多拉·塞帕拉达斯·埃姆塞乌·普里奥·帕科特、埃姆韦斯·德埃斯帕尔哈达斯·波罗瓦里奥斯·奥特罗斯·帕科特斯、塔姆贝梅·普雷蒂卡的基本准许可混音是必要的náo devem usar a marca registrationda do Fedora公司e em vez disso,crie seu próprio pacote*-您使用的徽标o pacote-通用徽标。

图书馆

Muitas指导了特殊情况下你的domínio references-se a“bibliotecas”,“módulos”,“plug-ins”ou-outros-termos speciaficos do idoma ou-domininio。特别是重要的条款。Alguns aplicativos podem包括bibliotecas e algumas bibliotecas podem包含aplicativols,portanto a distinço nem sempreéclara。

图书馆?

  • Se o objetivo principal de um pacote for necer executáveis para serem executados pelos usuários,Es RECOMENDADO que ele seja empacotado como um aplicativo执行委员会主席。Se também includeir bibliotecas que podem ser importadas ou vinculadas por outro código,领事馆misto的Pacotes阿巴克索。

  • 作为执行人员的主要目标,DEVE是一个应用程序。Se também includeir bibliotecas que podem ser importadas ou vinculadas por outro código,领事馆misto的Pacotes阿巴克索。

商业中心决定了合同的主要性质。上游játeráfeito的Muitas vezes isso comsua escolha de nomenclatura e e e RECOMENDADO que essa escolha-seja seguida pelo empacotador do Fedora。

misto的Pacotes

Muitos pacotes,独立的da sua finalidade负责人,包括aplicaçóes e bibliotecas。Neste caso,εRECOMENDADO que um ou ambos sejam empacotados em subpacotes para permitir que outros aplicativos dependam apenas da biblioteca e náo do aplicativo associado(s)。无需依赖图书馆服务,NÃo E RECOMENDADO包括automaticante outros aplicativos associados a essa biblioteca ou servço。

独立国家条约

RECOMENDADO que os pacotes sejam instaláveis de forma independent sempre-que isso for tecnicamente viável,mas eles DEVEM specificar dependicar encias do tipo correto em outros pacotes,se necesário,vejaTipos de dependeáncia公司阿巴克索。

桌面应用程序NéO DEVEM依赖于桌面应用程序,这是一种必要的限制.桌面维西维尔(um arquivo).桌面圣contém a linhaNoDisplay=真)NÃO DEVEM标准要求,建议欧点补充资料他们的质量超过了桌面可视级别、直接或间接的内容。

Por examplo,seria razoável que um editor de níveis de video game exigisse o video games associado para functionar,ou que om plug-in de aplicativo exigisse-o aplicativo associadio。Mas náo seria razoável que um aplicativo que usasse uma biblioteca de banco de dados dependencies de um concunto de banco dedados associado a esa biblio teca,ou que uma aplicaço que usase uma languagem de programaçáo speccifica dependentse de ferramats de gerenciamento associadas a essa essa language de programmaçóo。

Se um pacote fonte fornece mültiplas aplicaçoes gráficas,essas aplicativos DEVEM ser empacotados em subpacotes separados quando possível。

Arquivos规范

O arquivo spec(“spec”)éum elemento fundal no fluxo de trabalho de empacotamento。阿尔特拉桑·费塔酒庄没有任何协议,包括阿尔特拉桑酒庄(Qualquer alteraço feita no pacote)。Como os不同意Fedora sáo mantidos por uma comunidade de empacotadores e também por ferramats automatizadas,重要的是,特别是方便性的sigam certas conventionçes。一个主要的部分是将empacocamento diretries de empacotamento envolve o que consta nas speccificaçoes,mas aqui estáo alguans itens gerais。

Nomenclatura do arquivo规范

O arquivo规范DEVE ser nomado%{name}.spec.Ou seja,seo seu pacote代表denominado范例,o arquivo规范deveráser denominado示例规范.

合法性规范

Todos os arquivos spec DEVEM ser legíveis e mantidos de tal forma que a comunidade de empacotadores seja capaz de entendí-los e trabalhar comeles公司。

这是一个易于阅读的工具,也是Fedora和EPEL podem用户使用Pacotes Fedora的宏和条件。O uso de macros e conditionais para outras distribuiçoes,includio derivados do Fedora,náOépermitido em arquivos de specificaçose es de pacotes nos principais repositórios do Fedora,a menos ques essas macros e conditioniais tamb em estejam不代表Fedora。

Codificaço de arquivos规范

一个准确的用户角色论坛reportório ASCII码,vocánáo precisaráse preocupar com a codocataçáo do arquivo spec.se vocíprcisar de caracteres náo ASCII,salve seus arquivos de specificaçes como UTF-8。Se vocítiver düvidas sobre quais caracters sáo ASCII,领事馆埃斯特·格拉菲科.

Nomes de arquivos náo ASCII码

Da mesma forma,nomes de arquivos que contenham caracteres náo ASCII devem ser codicados como UTF-8。科摩奥·哈科莫·萨佩尔·埃姆夸尔·科摩多·科摩多·阿尔基沃·埃斯塔(Como náComo saber em qual codicaáo nome do arquivo está,usar a mesma codicaço para todos os nomes de arquivoséa melhor maneira de garantir que os usuários possamler os nomess dos arquivos-corretamente。上游enviar nomes de arquivos que náo estáo codicados em UTF-8,vocápoderáusar um utilityário como convmv(do pacote convmv)para converter o nome do arquivo em sua Seçáo%install。

Manutenáo dos规范

O repositório git do FedoraéO local canónico para os arquivos de speciaficaçoes do FedomaéO。DEVEM的管理者特别是自动化的管理者,他们有可能成为一个有煽动性的社区。圣雄甘斯曼彻斯特教堂(Se alguns mantenedores também estáo tentando manter cópias de uma speciafiicaçao em um repositório externo),DEVEM estar preparados para mesclar教堂(eles DEVEM estar preparado para mesclar)作为替代建筑的替代建筑(alteraçes feitas na speciaficaáo no repositörio do Fedora e NÃo DEVEM sobrescrever essas altera scomaóes comma cóp ia de um repositofedpkg进口.

Verificaço de arquivo-fonte公司

Nos casos em que o projeto upstream publica assinaturas OpenPGP de seus lançamentos,埃·雷科门达多que os pacotes Fedora verifiquem essa assinatura como part do process de construçáo do RPM(通过协议验证联邦政府的支持)。

没有认证的实体旁观卡雷戈广场,兰苏上游的埃拉诺信息中心。Uma assinatura dos desenvolvedores originais证书证明其为lançaram的方特。这是一个验证性的组织,它是一个建设性的组织。

Obtendo as chaves corretas(作为chaves corretas)

O método de verificaáO requer um arquivo de chaveiro OpenPGP comuma ou mais chaves püblicas do projeto上游。O chaveiro deveráconter todas as chaves confive is para certificar a autentidedide das fontesNÃO开发conter quaisquer胜过chaves。

理想,o projeto upstream publica esse chaveiro como um arquivo para下载。Vocádeve baixar esse arquivo e fazer tudo o que puder para verificar se eleéauténtico(声音开发、白萨尔塞斯、阿基沃、法泽尔、都铎、巴德)。Em seguida,vocádeveadictioná-lo sem modificaçoes ao pacote SCM e for necer sua URL no arquivo de specificaçose para que outros possam verifica-lo。URL开发美国HTTPS ou um protocolo autenticado de forma semelhante,se-possível。

“世界之音”确认了“查韦娜·普雷米拉·阿迪桑奥”,“埃拉伊达·奥门塔”确认了没有普雷米罗·乌索的形式。Isso garantiráque ataques futuros serão detectados se a chave for a correta,ou que um ataque atual serádetectado posteriorimente se versões futuras forem assinadas pela chave correta。

Verificando助手

埃拉,Quando a verificaçao do arquivo-fonteéfeita开发费塔·普雷米罗·纳萨奥爵士%准备执行arquivo de spec,antes que qualquer código potentialmente comprometido seja executado。核查开发费塔爵士coma宏%{gpgverify},que se expande em um comando cujos parámetros devem ser os caminhos do chaveiro,a assinatura e o arquivo assinado。生成要求:gnupg2埃内塞萨里奥(necesário)para que a verificaçáo functione。

Qualquer arquivo de assinatura desanexado(例如,foo.tar.gz.asc或foo.tar.gz.sig)没有缓存旁观做pacote junto com o código-fonte,enquanto o chaveiro deve ser enviado direcamente para o pacote SCM。

O开发服务器usado的单独格式:

来源0:ftp://ftp.example.com/pub/foo/%{名称}-%{版本}.tar.gz资料来源1:ftp://ftp.example.com/pub/foo/%{名称}-%{版本}.tar.gz.asc资料来源2:https://www.example.com/gpgkey-0123456789ABCDEF0123456789 EF.gpg生成要求:gnupg2%准备%{gpgverify}--密钥环=“%{SOURCE2}”--签名=“%}SOURCE1}”--data=“%{SOURCE0}”

一辆普里米拉·丰特埃奥(primeira fonteéo tarball real),一辆塞贡达·阿西纳图拉(segundaéA assinatura)在一辆特塞雷奥·查韦罗(terceiraéo chaveiro)上游行驶。

超越

Se o tarball do upstream de um pacote precisar ser modificado,por examplo,porque contém itens proibidos,entáo tar ball náo poderáser verificadocado como parte do processo de construçáo。Neste caso,o chaveiro OpenPGP做上游ainda deve ser include do no pacote SCM e as instruóes/script usadas para construir o tarball simplificado precisam verificar a fonte do上游。

Se o projeto upstream náo publicar um arquivo de chaveiro(por examplo,Se publicar apenas uma impremportáo digital em seu site e consultar uma rede de servidores de chaves para baixar a chave),talvez seja necessário criar um chaveiro-deposis de verificar a chave。Nesse caso,náo háURL上游para o chaveiro;portanto,érecomendado que vocédocument e como criou o chaveiro em um comentário no arquivo spec.um chaveiro-mínimo coma chave com a impressionáo digital第7天第33天第762页第6页第351页第30481347页第4b页第54cba826a18页pode ser criado com o seguinte comando公司:

gpg2--导出--导出选项导出最小值7D33D762FD6C35130481347FDB4B54CBA4826A18>gpgkey-7D33D72FD6C3530481347FDB4 B54CBA3826A18.gpg

上游辅助形式不同的tarball,por examplo,assinando apenas o tarball descompactado,mas distributuindo uma versáo compactada,ento a etapa de verificaćo deveráser ajustada de acordo,por exemplo:

来源0:ftp://ftp.example.com/pub/foo/%{名称}-%{版本}.tar.xz资料来源1:ftp://ftp.example.com/pub/foo/%{名称}-%{版本}.tar.asc资料来源2:https://www.example.com/gpgkey-0123456789ABCDEF0123456789 EF.gpg构建要求:gnupg2-xz%准备xzcat“%{SOURCE0}”|%{gpgverify}--密钥环=“%{SOURCE2}”--签名=“%}SOURCE1}”--data=-

圣维塔伊斯·杜兰特·伊尼夏利萨诺和平协议(Pacotes que sáo vitais durante a inicializaçao do Fedora podem usar um)自举操作GnuPG ser compilado的para pular a verificaáo antes do。

阿尤达

我国人民代表大会,我国人民群众大会,这是一个软件综合结构的认证。

支持阿奎图拉

Todos os pacotes do Fedora devem ser compilados e construídos com sucesso em rpms binários em pelo menos uma arquitetura primária suportada,除了quando o pacote for outil apenas em uma arquitetura secundária(como um utilityário de inicializaçáo esecífico da arquitetura,carregador de microódigo ou ferrama de configuraço de hardware)。Es recomendado que os empacotadores做Fedora façam todos os esforços para supportar todas为阿尔奎泰图拉斯·普里马里亚斯(arquiteturas primárias).

Conteúdo、código que náo precisa ser compilado e construído和e código independent de arquitetura(noarch)sáo exceçoes not aveis。

阿奎特图拉建筑法

Seum pacote Fedora náo compilar,construir ou functionar com sucesso em uma ou mais arquiteturas,ento essas arquiteturas devem ser listadas na specificaço em排除Arch.Cada arquitetura listada em公司排除Archprecisa ter um bug registrationdo no bugzilla que descreva a razáo pela qual o pacote náo compila/constrói/funciona naquela arquitetura错误注册。埃雷克门达多·奎、埃姆·塞吉达、奥努梅罗、塞加·科洛卡多、科门塔里奥、普洛西莫·林哈排除Arch通讯员。《圣彼得堡新约》(Novos pacotes náo teráo entradas do bugzilla durante o processo de revisáo)、《圣彼得和约》(entroéo recomendado que eles tenham esta descriáo no comentário atéque o pacote seja aprovado)、登记员(entrada no bugzille e substitiver a explicaçao longa pelo nümero do bug)。Por fim,érecommendado que o bug seja marcado como um bloqueio de um(ou mais)dos seguines bugs para simplificar o rastremento de tais problemas,我建议你简化问题:

Noarch com dependingáncias náo portadas公司

阿尔斯静脉,vocéestátrabalhand em um pacote noarch que sópode ser executado em locais nos quais um pacote-arqueado differenteéconstruído。Istoécomum para pacotes描述em uma languagem de script que depende do pacote interpretatador da languagems,por examplo。Se o pacote comquitetura no qual seu pacote Se baseia náo estiver disponível em todas as arquiteturas alvo do Fedora(即EPEL),vocáse deparaácoma uma situaço em que poderáprecisar excluir seu pacote dos repositórios de pacotes de certas arquiteturas ou importir que ele seja compilado em certas ar quiteturasem o sistema de construçáo。

特别是运行时间取决于编译速度

Vocípode limitar作为arquiteturas usadas para construir um pacote noarch e os repositórios aos quais o pacote no arch constructuído seráadicionado,usando作为标签排除建筑:欧点排他性架构::

BuildArch:noarch#听abaixo说arquiteturas nas quais o pacote dependente e construídoExclusiveArch:%{ix86}%{arm}x86_64 noarch

Ali s vezes,um runtime de languagem que vocíestáempacontando forneceráuma macro para os arcos em queádisponível,波尔示例,%{nodejs_arches}.Se existir,vocépode usar algo como公司ExclusiveArch:%{nodejs_arches}noarchem seu arquivo de speccificaçóes。Déuma olhada nas指导了整个宏观存在的语言。

Nenhuma fonte ou patch para arquitetura speccifica公司

Os pacotes NÃO DEVEM ter标签资料来源:欧点补丁:《圣约条件》。Por examplo,issoéproibido:

%ifarch第64页修补程序0:build-fix-for-ppc64.patch%结尾

Condicionar标签资料来源:欧点补丁:por arquitetura faz com que o conteüdo do pacote fonte seja differentee dependendo da arquitetura que foi usada para construí-lo。

观察que isso infelizmente阻止que%自动设置seja usado para aplicar补丁quando alguns desses补丁se aplicam apenas a determinadas arquiteturas。一个简单功能的melhor soluçãoéescrever补丁被称为arquitetras。用于possível,简单使用的Se isso náo%设置e使用宏%补丁耳旁cada补片usando%ifarch公司欧点%ifnarch公司遵守约定。Por示例:

%准备%设置-q%ifarch s390x软件%补丁0-p1%结束语

布局do sisma de arquivos

O Fedora segue O费多拉赛格文件系统层次结构标准(如葡萄牙语,Padráo de Hierarquia do Sistema de Arquivos)no que diz respeito ao layout do Sistema de Arquivos,com-execçes indicadas abaixo。O FHS定义onde os arquivos devem ser colocados no sisma。

超越

  • O Fedora许可证/usr/目标.

  • O Fedora náO permite novos diretórios diretamente em(O费多拉·诺允许新的直接指令)/欧点/用户使用程序sem a aprovaçáo do FPC。

Libexecdir公司

O(运行)文件系统层次结构标准不包括nenhuma provisáo para libexecdir、mas os pacotes do Fedora PODEM armazenar arquivos apropriados lá。Libexecdir(também conhecido como公司/usr/libexecem sistemas Fedora)sódeve ser usado como diretório para programmas executáveis que sáo projetados principalmente para serem executados por outros programmes e náo por usuários。

O rpm do Fedora包括uma宏para libexecdir,%{_libexecdir}.Os empacotadores sáo altamente encorajados a armazenar arquivos libexecdir em um subdiretório específico do pacote de公司%{_libexecdir},科莫%{_libexecdir}/%{name}.

上游施工脚本%{_libexecdir}entoáo esse o当地mais apropriado para configuraá-lo(por examplo,passando--libexecdir=%{_libexecdir}/%{name}段落o配置do autotools)。Se os脚本de construçáo do upstream náo suportarem isso,%{_libdir}/%{name}埃乌玛·塞贡达·奥帕里奥·瓦利达。Se vocáprecisar corrigir o supporte para usa um desses diretórios,entoávocédeve corrigier em LIBEXECDIR,de prefer e ncia configuraável em tempo de compilaçáo(para que distributuiçes que náo possuem/usr/libexecpossam definitir LIBEXECDIR para outro diretório mais apropriado para seus distribuiço)。

多实验室实验室

Se um pacote estiver isento de multilib,elepode usar公司%{_prefix}/库埃姆韦斯·德%{链接目录}.合同(Pacotes que contém arquivos específicos de arquitetura que normalmente seriam instalados em)%{_libexecdir}圣塞姆普雷·康塞德拉多斯·内列格韦是一个多功能图书馆。没有entanto,vocédeveter certeza de que o(sub)pacote em que eles estáo náo possui outro conteüdo que seria considerado elegível para multilib。圣埃斯特诺代表着“世界之音”,即“世界之声”。

/运行

Os servçOs do sistema devem armazenar pequenos dados voláteis de tempo de execuço em/运行Esteéum diretório suportado por tmpfs queémontado no início da inicializaço,antes de qualquer serviciado(e antes que/无功功率,无功功率esteja disponível)。/var/运行éum link simbólico legado段落/运行.

Nenhum arquivo ou diretório呜咽/开关磁阻电动机,/usr/本地欧点/主页/$USER

O(运行)FHS直径(traduzido):

“……建议开展项目特别是金融服务机构(específica de)/srv existente ou dados necessariamente armazenados em/srv。没有entanto,/srv-devesempre-existir没有FHS姐妹compativeis e deveserusado como当地padrão para tais dados。作为distribuiçoes devem tomar cuidado para náo去除剂arquivos colocados地方政府直接负责sem permissáo do administrador。"

O FHS要求明确控制直接环境污染/开关磁阻电动机ao administrador do sisma,e náoádistribuiço。Portanto,nenhum pacote Fedora pode ter arquivos ou diretórios em公司/开关磁阻电动机,vir pré-configrados para usar arquivos ou diretórios específicos em/开关磁阻电动机,para remover arquivos ou modificar os arquivo de qualquer forma对映体去除剂。

Além disso,nenhum pacote Fedora pode conter arquivos ou diretórios ou modificar arquivos-em公司:

  • /usr/本地,pois esses diretórios náo podem ser usados pelas distributuiçoes na FHS公司

  • /主页/$USER,pois os usuários podem modificar arvariamente os arquivos em seus diretórios pessoais e os pacotes rpm que modificam esses arquivo correm o risco de destruir os dado usuário。Al m disso,os sites podem montar/家em nfs em muitos tipos在蒙大拿州埃梅斯莫的姐妹会上有不同的要求。修改后的arquivos em diretórios pessoais assim configurados teráefeitos negatios em ambas as situaçes。

重要的公证人软件em um pacote Fedora,uma vez instalado e configurado por um usuário,pode usar/开关磁阻电动机科莫当地的护墙板。这是一个简单的发展过程

Uso limitado de公司/选择,/等/选项e(电子)/var/opt(变量/选项)

/选择seus diretórios放松(/等/选项e(电子)/var/opt(变量/选项))圣奥为FHS的必需品保留para uso dos。Reservamos o nome餐厅软呢帽通用域名格式拉那纳para nosso uso公司。Se um pacote instala arquivos em公司/选择ele sópode usar diretórios na hierarquia公司/opt/fedora(可选/软呢帽).O Fedora tenta organizer este diretório alocando um subdistretório do nosso diretório组织机构/opt/fedora(可选/软呢帽)特别是副食。Se vocíacha que precisa usar(美国之音)/opt/fedora(可选/软呢帽)赞成登记无FPC决定条款的票证/选择e qual subdiretório deve ser alocado para seu uso。

Atualmente、alocamos/opt/fedora/scls公司,/etc/opt/fedora/scls等e(电子)/var/opt/fedora/scls对uso-por软件集合.

谷歌的Chrome浏览器需要在本地进行扩展,使用户可以将其作为目录,而Empacotamento委员会则需要一个例外:um pacote PODE instarar arquivos no/etc/opt/chrome/本机消息主机e pode criar essa hierarquia de diretórios,desde que o pacote como um todo também supporte o Chromium。(O supporte ao Chromium PODE estar em um subacocate differente.)Se O Chrome no futuro permitir que um diretório mais padráO seja usado paraessa finalidade,esta execçO seráremovida。

合并的文件系统布局

Fedora已经合并了几个过去是独立的目录。

路径 与合并 RPM宏

/垃圾桶

/usr/bin(用户/二进制)

{绑定}

/斯宾

/usr/bin(用户/二进制)

%{绑定}

/usr/sbin

/usr/bin(用户/二进制)

%{间接寻址}

/库64/图书馆

/usr/lib64/用户/库

%{链接目录}

/图书馆

/用户/库

%{_prefix}/lib

例如,最终用户会发现/垃圾桶/桶与相同的文件/usr/bin/sh、和/usr/sbin/sendmail与相同/usr/bin/sendmail.

没有entanto,因为存在arquivo rpm náo functionam de acordo como queáNo sistema de arquivos,elas functionom de acordo-como caminho specificado na seáo rpm%文件.Entáo,um rpm que speccificou:

%文件/垃圾桶/桶

将能够满足的文件依赖性/垃圾桶/桶但不是为了/usr/bin/sh.包装必须使用中的实际文件系统路径%文件第节。如果其他包依赖于解析为同一文件的不同路径,并且不方便将其更新为新路径,则包可以使用虚拟提供列出备用路径。

例如:

提供:/sbin/ifconfig[...]%文件%{绑定}/ifconfig

使用rpm链接

执行rpmlint em rpms binários e fonte para examineá-los em busca de erros comuns e corrigi-los(menos que o rpmlint esteja errado,o que também pode concer)。Se vocíachar a saída do rpmlit enigmática,一个奥秘-e(电子)pode ser usada para obter descrióes mais detalhadas da maioria dos erros e avisos公司。观察que o rpmlint realizaráverificaóes adionais se receiber o nome de um pacote instalado。Por示例,dnf安装foo-1.0-1.f20.x86_64.rpm;rpmlint-i fooexecutaráum concento de testes no pacote foo que执行委员会rpmlint foo-1.0-1.f20.x86_64.转/分圣波德。乌玛·帕吉娜·曼蒂达·佩拉(Uma página mantida pela comunidade)清醒问题阿奎.

标签e seçóes

  • 作为标记版权:,包装商:,小贩:e(电子)先决条件:NÃO DEVEM ser usadas公司。

  • NÃOéRECOMENDADO que a标签BuildRoot:,一个标签组:埃萨桑%清洁塞果酱usadas。

  • NÃOéRECOMENDADO que O conteúdo de buildroot seja removido na primeira linha de公司%安装.

  • NÃOéRECOMENDADO que O valor da tag`摘要:` termine comum ponto。

  • 作为标记资料来源:documentam onde包含原始字体的pacote。Na maioria dos casos,Es RECOMENDADO que seja uma URL complete para o tarball上游。特殊情况下,咨询Diretrizes de SourceURL.

  • 中的URL网址:,资料来源:补丁:标签应尽可能要求对服务器进行身份验证。这通常意味着写https(https):而不是网址:ftp(英尺/分钟):.

协议依赖性

托达斯作为契约的依赖者(tempo de construçáo ou tempo e execuçao,regulares,fracas ou outras)DEVEM SEMPRE ser satisfeitas nos repositórios of ciais do Fedora。

O RPM pode determinar automaticamente depending encias para a maioria das bibliotecas compiladas e para algumas languagens de script como Perl的RPM podedeterminar-automaticamente取决于存在性。Dependáncias determinadas as automaticante NÃO DEVEM ser duplicadas por dependeáncia s manualais。

作为dependáncias de compilaço,no entanto,DEVEM ser listadas explicitamente,a menos que vocáesteja usando um gerador automático de dependeáncia de compila-sano(por examplo,生锈欧点蟒蛇). 咨询构建时间依赖项(BuildRequires).

Para dependingáncias versionadas(tempo de construçáo ou tempo de-execuço),即RECOMENDADO que sejam usadas APENAS quando realmente necesárias Para garantir que a versáo adequada de um pacote esteja presente。Se uma dependingáncia versionada for satisfeita por uma versáo present em try’s versées beforees do Fedora entáo uma deepended en cia version ada náo necesária e o uso de uma dedepended e ncia regular nn o version adaa e RECOMENDADA em seu lugar。

这是一个依赖版本,它定义了DEVE,包括依赖版本。Caso contrário,一个独立于世界各地的机构。

Tipos de dependeáncia公司

要求DEVE服务器对软件功能或更正的必要性具有依赖性。

如果程序包功能正常但容量减少,则建议建议应该使用。如果默认情况下该功能对用户可用,建议应该使用,并且建议否则。或者,反向依赖补充资料增强功能可以在其他包中使用。请参见打包:弱相关性有关使用这些依赖项类型的指南。

阿奎特图拉的独立国家

这取决于宏观经济%{?isa}奥诺梅多·帕科特。Por示例:

需要:foo

塞托纳:

需要:foo%{?_isa}

Se o pacote foo devel tiver um script foo config,vocêpode tentar fazer foo config--libs e foo config--cflags para obter dicas fortes de quais pacotes devem ser marcados como requisitionos do foo。Por示例:

$gtk-config--标记-I/usr/include/gtk-1.2-I/usr/incloude/glib-1.2-I/usl/lib/glib/include-I/usr/X11R6/include$gtk-config--库-L/usr/lib-L/usr/X11R6/lib-lgtk-lgdk-rdynamic-lgmodule-lglib-ldl-lXi-lXext-lX11-lm

Isso significal que gtk+-devel开发内容

需要:glib-devel%{?_isa}libXi-devel%{吗_isaneneneep libXext-devel%}?_issa}

丰富/布尔依赖项

软件包可以充分利用丰富(或布尔)依赖项功能支持RPM。

文件和目录依赖项

RPM使您能够依赖任意文件或目录而不是包。包可能包含以下目录之一内路径的此类依赖项:

  • /usr/bin(用户/二进制)

  • /等

它们也可能依赖于显式提供:。它们不得包含对其他路径的依赖关系,因为这需要启用其他存储库元数据的下载。

请注意,多个包提供同一目录的情况并不少见。目录依赖关系仅用于表示对现有目录的依赖关系,而不是对可能提供该目录的任何其他软件包的任何其他功能的依赖关系。

声明文件和目录依赖项时,安装路径宏喜欢%{间接寻址}不得使用。%{绑定}提供的包的一些工具可能不同于%{绑定}需要某种工具在这种情况下,BuildRequires:%{_binder}/sometool无法按预期工作。

明确要求

Explicit Requires是由打包程序在规范文件中手动添加的Requires。包中不能包含库上不必要的显式Requires。我们通常依靠rpmbuild来自动添加对库SONAME的依赖关系。现代的包管理工具能够解决这种依赖关系,从而在许多情况下确定所需的包。然而,当前版本的rpmbuild仅在库SONAMES上添加dep,而不是库的完整版本。如果库在一段时间内添加了一些功能,而没有向后不兼容,这可能会导致SONAMES发生更改,那么这可能是一个问题。这可能会导致这样的情况:用户安装了旧版本的库,在Fedora中构建了带有新ABI的新版本库,并构建了使用该ABI的应用程序。如果用户只是尝试安装或更新某个应用程序,而没有同时更新库,则应用程序将正常安装(因为满足了SONAME依赖关系),但在运行时将失败,因为系统上安装的库缺少它所需的功能。

尽管您确实需要添加显式的库依赖项来防止发生这种情况,但在所有包中手动指定它也有缺点。历史表明,当库/文件从一个包移动到另一个包时,当包被重命名时,当多个替代包中的一个包就足够了,以及当版本控制的显式依赖变得过时和不准确时,这种依赖会增加混淆。此外,在某些情况下,包名称上的旧显式依赖关系需要不必要的更新/重建。例如,Fedora包只需要保留两个完整发布周期的历史供应。

正因为如此,也正因为我们希望在rpmbuild中修复此问题,所以需要注意这一点,但不需要显式地指定需要的库及其版本信息。

当需要显式库Requires时,显式库依赖项通常应该是特定于体系结构的(除非涉及的包是noarch的),并且应该有一个规范文件注释来证明其合理性:

#对libfubar.so.1的自动依赖性不足,#因为我们严格需要至少修复两个segfault的版本。要求:libfubar%{?_isa}>=0:1.2.3-7

包装人员应酌情重新访问显式依赖项,以避免其变得不准确和多余。例如,在上面的示例中,当libfubar<1.2.3-7中没有当前的Fedora版本时,就不再需要列出明确的版本化需求。

筛选自动生成的需求

RPM尝试在构建时自动生成Requires(和Provides),但在某些情况下,自动生成的Requires/Provides不正确或不需要。有关如何筛选出自动生成的Requires或Provides的更多详细信息,请参阅:打包:AutoProvidesAndRequiresFiltering.

构建时间依赖项(BuildRequires)

包使用构建要求:标签。您可能会假设有足够的环境供RPM运行、构建包和执行基本的shell脚本,但您不应该假设任何其他包作为RPM依赖项存在,并且构建系统引入buildroot的任何内容都会随着时间而改变。

BuildRequires和%{伊萨}

您不得使用拱形BuildRequires。拱门最终位于建成的SRPM中,但SRPM需要独立于架构(architecture)。例如,如果您这样做:

#*不*做什么的示例构建需求:foo%{?_isa}>=3.3

然后,在Fedora中构建的SRPM将具有以下要求之一,具体取决于创建SRPM的构建器:

foo(x86-32)>=3.3#或foo(x86-64)>=3.3

Isso impediria que o yum-buildep ou ferramatas类似于SRPM功能的要求。

BuildRequires com基础pkg配置

Pacotes do Fedora que usam公司pkg配置para compilar em uma biblioteca(por examplo,'foo')da qual dependem,参考文献,开发expressar sua depending e ncia de construçáo corretamente como公司pkgconfig(foo).领事馆Para obter mais informaóes包装:PkgConfigBuildRequires.

取决于施工进度

Se o arquivo规范contém depending e ncias conditionais selecionadas com base na presença de argumentos opcionais--有(无)foo对位rpmbuild公司,construa o RPM fonte a ser enviado com as opçes padráo,ou seja,para que nenhum desses argumentos estáo presented na linha de comandorpmbuild公司.一个razáoéque需要一个“serializitos”,没有RPM字体结果,ou seja,作为conditcionais náo se aplicam mais。

总结和说明

摘要应该是对文件包的简短描述。描述对此进行了扩展。说明中不要包含安装说明;这不是一本手册。如果软件包需要一些手动配置或有其他重要的用户说明,请让用户参阅软件包中的文档。添加自述。费多拉或者类似的,如果你觉得这是必要的。此外,请确保描述中的行长度不超过80个字符。

请撇开个人喜好,在摘要和描述中使用美式英语拼写。如果可用,软件包可以包含支持的非英语语言的其他翻译摘要/描述。

摘要或说明中的商标

包装商应注意如何在摘要或说明中使用商标。有一些规则需要遵循:

  • 从不使用(TM)(右)(或Unicode等效的™/®)。正确地使用它们是非常复杂的,所以实际上我们完全不使用它们更安全。

  • 以不含糊的方式使用商标。避免使用“类似于”或“喜欢”这样的短语。一些示例:

  • 坏的:它类似于Adobe Photoshop。

  • 良好:它支持Adobe Photoshop PSD文件

  • 坏的:Microsoft Office的Linux版本

  • 良好:支持Microsoft Office DOC文件的文字处理器

如果你不确定,问问自己,有没有可能有人会感到困惑,认为这个包裹是商标商品?当有疑问时,尽量去掉商标。

文档

源发行版中包含的任何相关文档都应包含在相应文档目录中的包中。无关文档包括构建说明,无所不在安装包含非Linux系统的通用构建指令或示例以及文档的文件,例如。自述。MSDOS公司。还要注意您在哪个子包中包含文档。例如,API文档属于-开发子包,而不是主包。或者,如果有很多文档,可以考虑将其放在子包中。在这种情况下,建议使用*-文件作为子包名称。

标记a相对的路径%文件在中%文件节将导致RPM从中复制引用的文件或目录%_建筑工人到适当的位置进行文档记录。文件也可以放在%_pkgdoc目录,被打包的软件的构建脚本在调用时可以自动执行此操作%安装。但是,混合使用这些方法是有问题的,可能会导致文件重复或冲突,因此使用%文件具有相对的文件的路径和直接安装到%_pkgdoc目录禁止在同一源包中。

标记为文档的文件不得导致包引入比没有文档时更多的依赖项。在大多数情况下,确保这一点的一个简单方法是从中的文件中删除所有可执行权限%_pkgdocdir公司.

文件位于%_pkgdocdir公司不得影响打包软件的运行时间。如果这些文件被修改、删除或根本没有安装,则软件必须正常运行且功能不变。

尽管许可文件是文档,但它们会被特殊处理(包括使用不同的标记)。请参阅许可指南如何处理它们。

单独的文档包

如果构建文档需要许多其他依赖项,那么您可以选择不在主包中构建它,而是创建一个单独的*-doc源包,该源包只构建文档。此单独打包的文档必须与打包软件的版本相对应。换句话说,如果软件的新版本包含对文档的更改,那么文档包也必须更新。但是,如果新版本的软件不包含文档更改,则您可以选择不更新文档包。

应在主包的Version标签附近添加注释,以提醒维护人员在需要时更新单独的*-doc包。

变更日志

更改日志描述与包用户相关的包更改。这包括新的上游版本、对包构建方式的重要更改、重建以及其他影响结果的更改。变更日志中不应提及仅与包装商相关的变更。这包括规范文件清理、构建错误修复或解决方法,以及对二进制包的内容没有影响的其他更改。

变更日志应该使用%自动变更日志宏:

%变更日志%自动更改日志

提交主题(提交消息的第一行)和一些可选的附加行用于生成变更日志文本。变更日志条目中还使用提交作者姓名、电子邮件地址和提交时间戳。

提交消息中的文本将成为更改日志的一部分,它应该提供与用户相关的更改的简要摘要。提交消息可能包含与打包程序相关的附加信息。

如果特定更改与Bugzilla错误相关,请在更改日志条目中包含错误ID以便于参考,例如。

添加README文件(rhbz#1000042)

如果特定提交修复了CVE,则也应包含此信息。

其目的是给用户一个提示,告诉他们软件包更新中发生了什么变化,而不会让他们被技术细节淹没。它们决不能仅仅包含源CHANGELOG条目的完整副本。对于需要更多信息的用户,可以输入上游新闻文件或变更日志的链接。

请参见自动更改日志文档有关如何从git提交消息生成变更日志,以及如何为某些提交创建多行条目或跳过条目的详细信息。

包装工可以或者使用手动更改日志,而不是%自动更改日志宏。这在中进行了描述手动更改日志.

离职

打包程序将包更新到版本1.0并创建提交

$git节目提交000000000000 1234567890 EF000000000000作者:Joe Packager<joe@example.com>日期:2003年6月14日,星期三版本1.0…(rhbz#1000024)-还修复了rhbz#1000025中报告的减速-上游变更日志:https://example.com/package/NEWS.html#v1.0已清除等级库文件中的空白。diff—git包.spec包.speg索引5c77064c03..efcd53a61c 100644---包装规格+++包装规格@@ -1,5 +1,5 @@名称:包-版本:0.1+版本:0.2释放:%自动释放...

当构建包时,将生成一个适当的变更日志条目。可以使用预览rpmautospec生成噬菌体日志:

$rpmautospec生成更改日志*2003年6月14日星期三Joe Packager<joe@example.com> - 0.2-1-版本1.0(rhbz#1000024)-还修复了rhbz#1000025中报告的减速-上游变更日志:https://example.com/package/NEWS.html#v1.0

请注意,更改日志中没有包含有关空白的句子。

手册

由于手册页是获取Unix系统帮助的传统方法,因此包中应包含所有可执行文件的手册页。如果缺少一些手册页,包装商应与上游合作添加这些手册页。偶尔也可以找到其他发行版创建的页面,或者使用帮助2man程序;这些通常是有用的起点。安装手册页时,请注意RPM会将其重新压缩为首选格式。所以%文件章节必须参考手册页,并将其模式考虑在内:

%文件%{手动}/man1/foo.1*

还请注意,安装在中的文件%{手动}由RPM自动标记为文档。因此没有必要使用%文件.

对于本地化的手册页,请使用%find_lang—与man一起如中所述处理区域设置文件.

编译器

Fedora包应默认使用gcc作为编译器(对于gcc支持的所有语言),如果上游不支持使用gcc构建,则应使用clang。然而,如果有很好的技术原因,打包程序可能会选择不使用默认编译器。不使用默认编译器的有效技术原因示例包括但不限于:

  • 默认编译器无法正确生成包。

  • 为了让默认编译器正确编译其包,打包程序需要禁用编译器功能(例如LTO)。

  • 默认编译器生成包所需的时间要长得多。

  • 默认编译器缺少对包有益的功能。

选择使用非默认编译器的打包程序应在规范文件的注释中记录此决定的原因。

编译器宏

如果使用clang构建包,则打包程序必须将%toolchain宏设置为clang:

%全球工具链叮当作响

这样可以确保在编译时使用Fedora特定于clang的编译器标志。

如果打包程序希望在规范文件中使用条件宏,以便在两个不同的编译器之间切换,则应使用以下宏名称:

%bcond_with toolchain_clang(与工具链链接)%用工具链连接gcc

打包程序还可以使用spec文件中的%build_cc、%build_cxx或%build-cpp宏来代替编译器名称的硬编码。通过将%toolchain宏设置为clang或gcc来控制这些变量的值。

编译器标志

用于构建包的编译器必须遵循系统rpm配置中设置的适用编译器标志。Honoring意味着该变量的内容被用作编译器在包构建过程中实际使用的标志的基础。

对于C、C++和Fortran代码%{optflags}宏包含这些标志。通常不鼓励在性能优化中覆盖这些标志(例如,使用-O3而不是-O2)。如果您可以提供基准测试,以显示此特定代码的显著加速,那么可以逐个案例重新进行讨论。如果有充分的理由,允许添加、覆盖或过滤这些标志的部分;这样做的理由必须记录在specfile中。

通常允许使用某些与安全相关的标志。这些标志可能会稍微降低性能,但对某些程序来说,增加安全性是值得的。

PIE公司

PIE通过将可执行文件完全由位置无关的代码组成来为其添加安全性。位置相关代码(PIC)是正确执行的机器指令代码,与它在内存中的位置无关。PIE允许Exec Shield使用地址空间布局随机化,以防止攻击者在安全攻击期间使用依赖于知道二进制文件中可执行代码偏移量的漏洞(例如return to libc攻击)知道现有可执行代码的位置。

在Fedora中,默认情况下启用PIE。要在规范中禁用它,请添加:

%取消定义强化生成

如果您的软件包满足以下任何条件,则不得禁用PIE编译器标志:

  • 你的包裹很长时间了。这意味着它可能会启动并一直运行,直到机器重新启动,而不是按需启动并在空闲时退出。

  • 您的包中包含suid二进制文件,或者包含功能的二进制文件。

  • 您的包以root用户身份运行。

Debuginfo包

包装应产生有用的-调试信息包,或者在无法生成有用的包时显式禁用它们,但rpmbuild仍会这样做。每当-调试信息包被显式禁用,规范文件中需要解释为什么这样做。Debuginfo包将在单独的文档中进行更详细的讨论,包装:Debuginfo.

Devel软件包

Fedora包的设计必须具有文件的逻辑分隔。具体来说,-devel包必须用于包含仅用于开发或仅在构建时需要的文件。这样做是为了最小化用户的安装占用空间。有一些类型的文件几乎总是属于-devel包:

  • 头文件(foo.h),通常位于/usr/include中

  • 包未提供任何匹配的共享库文件时的静态库文件。请参见打包静态库有关此场景的更多信息。

  • 如果还存在匹配的版本化共享系统库文件,则为未版本化共享的系统库文件。例如,如果您的软件包包含:

/usr/lib/libfoo.so.3.0.0/usr/lib/libfoo.so.3/usr/lib/libfoo.so

版本化的共享库文件(/usr/lib/libfoo.so.3.2.0和/usr/lib/libfoo.so.3)是用户运行与libfoo链接的程序所必需的,因此它们属于基本包。另一个未转换的共享库文件(/usr/lib/libfoo.so)仅用于将libfoo实际链接到正在编译的代码,不需要安装在用户系统上。这意味着它属于-devel包。请注意,在大多数情况下,只有完全版本化的共享库文件(/usr/lib/libfoo.so.3.2.0)才是实际文件,所有其他文件都是指向该文件的符号链接。当共享库文件仅以非版本化格式提供时,打包程序应要求上游考虑提供正确版本化的库文件。然而,在这种情况下,如果用户需要共享库文件来运行链接到它的程序,那么它必须进入基本包。如果上游在将来对共享库文件进行版本控制,则打包人员必须小心移动到上述版本控制布局。

另一个复杂的问题是,一些软件生成了未版本化的共享对象,这些对象不打算用作系统库。这些文件通常是特定于应用程序的插件或模块化功能,不位于ld库路径或缓存中。这意味着它们不直接位于/usr/lib或/usr/lib64中,也不位于/etc/ld.so.conf(或/etc/ldso.conf.d/config文件)中作为库路径列出的目录中。通常,这些未版本化的共享对象可以在/usr/lib或/usr/lib64下的专用子目录中找到(例如,/usr/ib/purple-2/是用于libpurple应用程序的插件目录)。在这些情况下,不需要将未版本化的共享对象放在-devel包中。

这种包装模式有一些明显的例外,具体如下:

  • 编译器通常在主包中包含开发文件,因为编译器本身仅用于软件开发,因此,拆分包模型没有任何意义。

当对某个文件是否属于基本包或in-devel有疑问时,打包人员应考虑该文件是否必须存在,以便用户正确使用或执行基本包中的功能,或者它是否只对开发有必要。如果它只是开发所必需的,那么它必须进入-devel包。

与所有Fedora包装指南一样,人们认识到,有一些独特的情况超出了这个模型的边界。如果你遇到这种情况,请用Fedora包装委员会并向我们解释,以便我们能够扩展《准则》来解决这一问题。

Pkgconfig文件(食品.pc)

pkgconfig(.pc)文件的位置取决于其用例。因为它们几乎总是用于开发目的,所以应该放在-devel包中。一个合理的例外是,主包本身是一个开发工具,没有安装在用户运行时中,例如gcc或gdb。

需要基本包

子包通常是其基本包的扩展,在这种情况下,它们应该需要其基本包。当子包需要基本包时必须使用完全版本化的特定于体系结构的依赖项(对于非noarch包)执行此操作:

需要:%{name}%{?_isa}=%{版本}-%{发布}

Devel包是一个必须使用完全版本依赖项的基本包的包示例-只包含共享库的libs子包通常不需要显式依赖于它们的基本包,因为它们通常不需要基本包是函数库。

如果您最终遇到主包依赖于子包和主包上的子包的情况,您应该仔细考虑为什么主包中没有所有内容。

共享库

只要可能(并且可行),包含库的Fedora包都应该将它们构建为共享库。没有必要打电话ldconfig(ldconfig)安装共享库时。

列出共享库文件

直接安装到中的共享库%{链接目录} 不应该列在%文件通过使用glob来隐藏文件名的重要部分(例如。libfoo.so文件*),因为更改了人名在大多数情况下,还会导致文件名更改。

否则,当库遇到SONAME公司作为更新的一部分,此更改可能会被忽略,并导致诸如断开依赖关系之类的问题(请参阅相关的更新策略部分了解更多信息)。

然而,如果包装商认为globs的使用有用,例如,如果Y(Y)Z轴名为的库的部分libfoo.so.X.Y.Z经常更改,使用类似libfoo.so.X{,.*}相反,建议使用,因为依赖包通常不必为此类更改重新构建。

下游.所以名称版本控制

在上游船舶未版本化的情况下图书馆(因此插件、驱动程序等不需要这样做),打包程序必须尝试说服上游开始对其进行版本控制。

如果由于上游不情愿或无响应而失败,则打包者可能会开始下游版本控制,但必须谨慎操作,最好只在极少数情况下进行。我们不想创建一个可能与上游冲突的库,如果他们稍后开始提供版本化的共享库。在任何情况下,都不应在Fedora中运送未版本化的库。

对于下游版本控制,名称应如下所示:

libfoobar.so.0.n

这个n个最初应该是一个小整数(例如,“1”)。我们在这里使用两个数字(“0.n”),因为上行流的常见做法是在这里只使用一个数字。使用多个数字有助于我们避免未来潜在的冲突。不要忘记将SONAME字段(参见下文)添加到库中。

发布库的新版本时,应使用ABI比较工具检查构建的共享库中的ABI差异。如果检测到任何不兼容,请将n个一个接一个。

SONAME处理

当使用SONAME字段运行链接到共享对象的可执行文件时,动态链接器会检查此字段而不是文件名,以确定它应该链接到的对象。这允许开发人员简单地链接到未版本化的库符号链接,动态链接器将链接到正确的对象。

请记住,尽管文件名通常是库的SONAME加上一个递增的次要版本,但并没有任何内在联系。ldconfig使用SONAME作为指向实际文件名的符号链接的值。然后,动态链接器使用该符号链接查找库,而不考虑实际的文件名。动态链接器只对字段进行简单的相等性检查,不检查ABI不兼容或类似问题。这是使用ABI比较工具并增加SONAME。

链接器使用(至少在以下情况下)将SONAME字段写入共享对象ld个)的-soname soname公司旗帜。这可以作为选项传递给海湾合作委员会这样地:

$gcc$CFLAGS-Wl,-soname,libfoo.so.0.n-o libfoo.so.0.n

如果要检查是否设置了SONAME字段及其值,请使用反汇编命令(来自binutils公司):

$objdump-p/path/to/libfoo.so.0.n|grep“SONAME”

打包静态库

包含库的包应尽可能排除静态库(例如,通过配置--禁用静态). 与库链接的应用程序应该与共享库链接,而不是静态版本。

Libtool档案,食物.la文件,不应包括在内。默认情况下,使用libtool的软件包将安装这些软件,即使您使用配置--禁用静态,因此可能需要在包装前将其移除。由于libtool旧版本中的错误或使用它的程序中的错误,有时不可能在不修改程序的情况下删除*.la文件。在大多数情况下,与上游合作解决这些问题相当容易。请注意,如果您正在稳定版本(而不是devel)中更新库,并且包中已经包含*.la文件,那么删除*.la文件应该被视为API/ABI更改-即,删除它们会更改库提供给世界其他地方的接口,因此必须遵循Fedora政策,以进行可能会破坏稳定的更新。

打包静态库

  • 一般来说,打包者不应该运送静态库。

  • 我们希望能够跟踪哪些包正在使用静态库(例如,如果静态库中的安全缺陷得到修复,我们可以找到哪些包需要重建)。静态库打包有两种情况:

    1. 静态库和共享库。在这种情况下,静态库必须放置在*-静态分装。将静态库与其他开发文件分离在里面*-开发允许我们通过检查哪些包来跟踪此使用情况需要生成这个*-静态包裹。其目的是只要可能,包将不再使用这些静态库,到共享库。如果*-静态子包需要标头或其他文件*-开发为了有用,它必须需要*-开发分装。

    2. 仅限静态库。当包只提供静态库时您可以将所有静态库文件放在*-开发分装。这样做时,您还必须有一个虚拟供应商对于*-静态包裹:

      %软件包开发提供:foo-static=%{版本}-%{发布}

明确需要链接到静态版本的包必须BuildRequire:foo-static(构建要求:foo-static),以便可以跟踪使用情况。

  • 如果(并且仅当)包具有需要静态库才能正常工作的共享库,则可以将静态库包含在*-开发分装。开发子包必须具有虚拟的*-静态的包及其依赖的包必须需要生成这个*-静态包裹。

打包仅标头库

某些库,尤其是一些C++模板库,是仅标头库。因为代码是在编译时生成的,所以它们的行为就像静态库一样,需要这样处理。

将所有头文件放在*-开发然后必须为*-静态包裹:

%软件包开发提供:foo-static=%{版本}-%{发布}

使用头库的包必须BuildRequire:食品静态,以便可以跟踪使用情况。

仅在子包中使用noarch

头库的基本包不得标记为noarch。这样可以确保在所有体系结构上运行任何测试,并可以检测构建或安装过程是否基于构建体系结构修改了标头。

当子包的内容,包括-开发包,实际上是架构依赖的,它们可能仍然被标记为noarch。由于头库的基本包通常没有%文件列表中,这可能会产生一个只构建noarch-rpms的arched包。这可能需要添加%全局调试包%{nil}到spec文件,以避免为空调试源文件.list问题。

静态链接可执行文件

不应将可执行文件和库与来自其他包的库静态链接。(当然,在包的构建过程中生成的文件可以静态链接到.a个作为构建过程的一部分生成的文件。)

如果需要链接到.a来自不同包的文件,对-静态包(不仅仅是-开发提供这些文件的软件包)必须存在,以便可以跟踪使用情况。

系统库的捆绑和复制

Fedora包应尽一切努力避免将多个独立的上游项目捆绑在一个包中。

所有上游允许根据系统库构建的包都必须根据系统库进行构建。在这种情况下,捆绑库(和/或其源代码)必须在%准备。可能需要修补生成脚本以处理此情况。只要可能,补丁应该限制捆绑库的使用,以便可以将补丁发送到上游以供考虑。

所有上游没有针对系统库构建机制的软件包都可以选择使用捆绑库,但如果使用,则必须包含捆绑库的指示。这提供了一种使用捆绑代码定位库的机制,例如,它可以帮助定位可能具有特定安全漏洞的包。

要指示绑定实例,请首先确定绑定库的名称和版本:

  • 如果捆绑包也单独存在于分发中,请使用该包的名称。否则,请咨询命名原则确定库的适当名称,就像它作为单独的包进入分发版一样。

  • 使用版本控制指南以确定库的适当版本(如果可能)。如果库是从上游派生的,请使用最近合并或重新建立基址的上游版本,或者使用派生时原始库所携带的版本。

然后在规范中的适当位置添加提供:捆绑(<libname>)=<version>哪里<libname><版本>是您在上面确定的名称和版本。如果无法确定版本,请使用提供:捆绑(<libname>)而不是。

除了以这种方式指示捆绑外,对于上游没有针对系统库构建机制的包,必须公开联系以获取支持系统库的路径。如果上游拒绝,则必须将其记录在规范文件中,可以是放在上面“提供:”旁边的注释中,也可以是检入SCM并由放置在提供:以上。

避免在其他软件包中捆绑字体

通用格式的字体,如Type1、OpenType TT(TTF)或OpenType CFF(OTF),应遵守特定的包装准则(包装/字体政策),并且应该始终打包在系统范围的字体存储库中,而不是私有应用程序目录中。有关详细信息,请参阅:包装/字体政策.

当心rpath公司

有时,在链接二进制文件时,代码会硬编码特定的库路径(使用-rpath或-R标志)。这通常称为rpath。通常,动态链接器和加载程序(ld.so)解决可执行文件对共享库的依赖性,并加载所需的内容。然而,当使用-rpath或-R时,位置信息将硬编码到二进制文件中,并在执行开始时由ld.so检查。由于Linux动态链接器通常比硬编码路径更智能,因此我们通常不允许在Fedora中使用rpath。

有一种工具叫做检查路径包含在rpmdevtools工具包裹。将其添加到%__架构_安装_支柱~/.rpmmacro公司配置文件:

%__架构_安装_支柱\/usr/lib/rpm/checkrpath\/usr/lib/rmp/check-buildroot

什么时候?检查路径运行时,您可能会看到如下输出:

错误0001:文件“/usr/bin/xapia-tcpsrv”在[/usr/lib64]中包含标准rpath“/usr/lib64”

检查路径标记的任何rpath必须被删除。

rpath(rpath)用于内部库

当程序安装内部库时,它们通常不会安装在系统路径中。这些内部库仅用于包中存在的程序(例如,用于排除可执行文件通用的代码)。这些库不打算在包外使用。发生这种情况时,包中的程序可以使用rpath来查找这些库。

例子:

#myapp的内部库位于:%{_libdir}/我的应用程序/%{_libdir}/myapp/libmyapp.so.0.3.4%{_libdir}/myapp/libmyapp.so#myapp具有%{_libdir}/myapp的rpath/readelf-d/usr/bin/myapp|grep RPATH0x0000000f(RPATH)库RPATH:[/usr/lib/myapp]
国际图书馆:Quando项目,为墨西哥图书馆发展服务替代疗法你把搬运工简化为图书技术段落%{链接目录}Dessa forma,o vinculador dinámico pode concentrar as bibliotecas sem precisar vincular todos os program as a um rpath(设计形式)。

替代方案rpath(rpath)

通常使用rpath是因为二进制文件正在非标准位置查找库(标准位置是/lib、/usr/lib、/lib64、/usl/lib64)。如果要将库存储在非标准位置(例如/usr/lib/foo/),则应在/etc/ld.so.conf.d/中包含自定义配置文件。例如,如果我将32位libfoo库放在/usr/lib/foo中,我想在/etc/ld.so.conf.d/中创建一个名为“foo32.conf”的文件,其中包含以下内容:

/usr/lib/foo

确保您也制作了该文件的64位版本(例如foo64.conf)(当然,除非该包对64位体系结构禁用)。

正在删除rpath(rpath)

有几种不同的方法可以修复rpath问题:

  • 如果应用程序使用configure,请尝试传递--禁用路径要配置的标志。

  • 如果应用程序使用libtool的本地副本,请在%configure之后将以下行添加到规范中:

%配置sed-i的|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=“”|g'libtoolsed-i的|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g'库工具
  • 有时,可以修补代码/生成文件以删除-rpath(rpath)-R(右)标记不被调用。然而,这样做并不总是容易或明智的。

  • 作为最后的手段,Fedora有一个名为chrpath公司。安装此软件包后,您可以运行chrpath—删除包含rpath的文件。因此,在前面的示例中,我们将运行:

chrpath—删除$RPM_BUILD_ROOT%{_bindir}/xapani-tcpsrv

确保记住添加构建要求:chrpath如果你最终使用这种方法。

配置文件

配置文件必须在包中进行标记。

根据经验,使用%配置(noreplace)而不是普通的%配置除非你最好的、有根据的猜测是,这样做会破坏一切。换言之,在升级包时覆盖配置文件中的本地更改之前,请仔细考虑。以下情况的示例使用诺雷普莱斯是指包的配置文件发生更改,导致新的包版本无法与以前包版本的配置文件一起使用。只要是普通的%配置如果使用,请在规范文件中添加简短注释,解释原因。

不要在/usr下使用%config或%config(noreplace)/usr被认为不包含Fedora中的配置文件。

包管理器的配置

软件包不得安装违反第三方存储库策略,除非这些文件安装在%{文档目录}.

产品配置

在Fedora.next世界,我们将有一套精心策划的Fedora产品以及经典Fedora的可用性。历史上,我们为所有Fedora安装维护了一组配置默认值,但不同的目标用户有不同的需求。请参阅产品配置指南获取有关如何创建需要在Fedora.next产品之间表现不同的包的说明。

起始程序

Fedora中禁止使用SystemV样式的initscripts。必须使用系统装置。

系统单元

打包系统单元和系统管理服务的详细指南如下在这里.

桌面文件

如果一个包包含GUI应用程序,那么它还需要包含一个正确安装的.desktop文件。出于这些准则的目的,GUI应用程序被定义为绘制窗口并从该窗口中运行的任何应用程序。已安装的.desktop文件必须遵循台式机-规格,特别注意验证Name、GenericName、,类别,启动通知条目。

桌面文件中的图标标记

可以通过两种方式指定图标标记:

  • 特定图标文件的完整路径:

图标=/usr/share/pixmaps/comical.png

  • 没有文件扩展名的短名称:

图标=滑稽

首选不带文件扩展名的短名称,因为它允许图标主题化(默认情况下假定为.png,然后尝试.svg,最后尝试.xpm),但这两种方法都可以接受。

.桌面文件创建

如果包中还没有包含并安装自己的.desktop文件,那么您需要创建自己的。您可以通过包含创建为源的.desktop文件(例如Source3:%{name}.desktop:)或在规范文件中生成它来实现这一点。以下是示例.desktop文件(comical.desktop)的内容:

[桌面输入]名称=喜剧GenericName=漫画存档阅读器注释=打开.cbr和.cbz文件执行=滑稽图标=滑稽端子=假类型=应用类别=图形;

桌面文件安装用法

仅仅在包中包含.desktop文件是不够的,必须运行桌面文件安装(英寸%安装)或桌面文件验证(英寸%检查%安装)并且有BuildRequires:桌面文件,以帮助确保.desktop文件的安全性和规范合规性。桌面文件安装如果软件包未安装文件或对.desktop文件进行了所需的更改(例如添加/删除类别等),则必须使用。桌面文件验证如果.tdesktop文件的内容/位置不需要修改,则可以使用。以下是一些用法示例:

桌面文件安装\--目录=%{buildroot}%{datadir}/applications\%{来源3}
桌面文件安装\--add-category=“音频视频”\--删除原件\--目录=%{buildroot}%{datadir}/applications\%{buildroot}/%{datadir}/applications/foo.desktop
桌面文件验证%{buildroot}/%{datadir}/applications/foo.desktop

将供应商标记应用于.desktop文件(使用--vendor)。

AppData文件

包含图形应用程序的包应包含AppData文件。请参见打包:AppData相关指南。

强烈建议打包程序使用宏而不是硬编码目录名(请参阅RPM宏). 然而,在宏比它所代表的路径长的情况下,或者在打包程序觉得使用实际路径更干净的情况下。打包程序可以使用实际路径而不是宏。这种方法有几个注意事项:

  • 包必须一致。对于同一规范中的任何给定路径,请使用硬编码路径或宏,而不是两者的组合。

  • %{libdir}必须始终用于二进制库,因为有多个库,您不能替换硬编码路径。

名称以下划线开头的宏通常被视为RPM及其相关宏包内部的实现细节,不应在规范文件中引用,除非设置其值以影响RPM行为。这意味着不应使用系统可执行文件的宏形式。例如,rm(毫米)应优先使用%{__rm}然而,在某些情况下,所需的数据根本不在没有下划线前缀的名称下提供。如果是这种情况,可以使用带前导下划线的宏。建议宏包的作者在命名要在规范文件中使用的宏时避免使用前导下划线(与设置相反)。

在Source:或Patch:行中包含宏是一个风格问题。有些人喜欢没有宏的源代码行的可读性。其他人更喜欢在使用宏时轻松更新新版本。在所有情况下,请记住在规范文件中保持一致,并验证列出的URL是否有效。spectool(来自rpmdevtools包)可以帮助您检查URL是否包含宏。

如果需要确定包含宏的实际字符串,可以使用rpm。例如,要确定实际Source:值,可以运行:

rpm-q--spec文件foo.spec--qf“$(grep-i^源foo.spe)\n”

%自动设置

作为常规的替代方案%设置%自动设置可以使用。除了正常的%设置任务外,它将自动应用规范中定义的所有修补程序#项。它还能够处理VCS格式的补丁文件,但这将需要额外的BuildRequires,并假设全部的规范中的补丁文件是针对单个VCS类型格式化的。因此,建议您不要使用%自动设置。有关正确使用的更多详细信息%自动设置,请参阅RPM文档.

使用%{内置程序}%{操作标志}$RPM_BUILD_ROOT($RPM_FUILD_ROOT)$RPM_OPT_FLAGS(美元)

在规范文件中定义rpm构建根和优化标记有两种样式:

宏样式

可变样式

生成根目录

%{内置程序}

$RPM_BUILD_ROOT($RPM_BUILD_ROOT)

选择。旗帜

%{操作标志}

$RPM_OPT_FLAGS($RPM_OPT_FLAGS)

选择一种样式而不是另一种样式没有什么价值,因为它们在所有场景中都会解析为相同的值。你应该选择一种风格,并在整个包装中始终如一地使用它。

混合这两种风格虽然有效,但从QA和可用性的角度来看是不好的,不应该在Fedora包中进行。

为什么%制造装置不应使用宏

Fedora的RPM包括%制造装置宏,但必须不是当make-install-DESTDIR=%{buildroot}工作时使用。%makeinstall是一个笨蛋,可以与不使用DESTDIR变量的Makefiles一起使用,但它有以下潜在问题:

  • %进行安装在“Make-install”期间重写一组Make变量,并在%{buildroot}路径前面加上前缀,即它执行Make-prefix=“%{buillroot}%{_prefix}”libdir=“%}buildroot}%{_libdir}…”。

  • 它很容易出错,在针对不太完美的Makefiles运行时可能会产生意外影响,例如,buildroot路径可能包含在安装时替换变量的已安装文件中。

  • 在执行“makeinstall”时,它可能会触发不必要的错误重建,因为make变量与%build部分的值不同。

  • 如果包中包含libtool存档,则可能会导致安装损坏的*.la文件。

相反,Fedora软件包应使用:%make_install(安装)(注意“_”!),使DESTDIR=%{buildroot}安装使DESTDIR=$RPM_BUILD_ROOT安装所有这些都做同样的事情。

源RPM构建时宏

中的所有宏总结:%描述需要在srpm构建时可扩展。由于SRPM是在未安装包的BuildRequires的情况下构建的,因此根据在规范文件外部定义的宏,很容易导致未展开的宏显示在构建的SRPM中。检查的一种方法是创建一个最小的chroot并构建srpm:

模拟--初始化模拟--复制/mock—shell bash转速-ivhcd/builddir/build/SPECSrpmbuild-bs--节点[SRPM]rpm-qpiv/builddir/build/build/SRPMS/[SRPM]

检查每分钟转数未展开宏的输出(%{foo})或缺少信息(当`%{?foo}`展开为空字符串时)。更简单的方法是在总结:%描述除非它们在当前规范文件中定义。

不当使用%_sourcedir公司

使用列为源#文件的文件的包必须按其来源#宏名称,不能使用$RPM_SOURCE_DIR(源代码)%{源代码}以引用这些文件。请参见包装:RPM_Source_Dir了解详细信息。

软件集合宏

软件集合将保留以将包与主流包分开,类似于MingW包被管理。

在过去,如果不使用SCL宏,则允许它们出现在主流包中。由于我们现在正在建立SCL,我们现在正在实施严格的分离。包装必须更新以将SCL宏仅限于那些特别批准作为SCL一部分的包。

其他RPM宏的打包

其他RPM宏必须存储在%{_rpmacrodir}中。它们必须使用语法“macros.$PACKAGE”命名(例如macros.perl)。

通常,这些文件打包在-devel子包中,因为它们通常只用于构建其他包。然而,在某些情况下,这并不总是理想的,我们鼓励打包人员在为这些文件确定合适的包时使用他们的最佳判断。RPM宏文件不得标记为%配置.

在规范文件内部编写脚本

有时需要编写一个简短的脚本(可能是一行),该脚本在%准备,%建造,或%安装spec文件的部分,以获取有关构建环境的一些信息。为了简化依存关系图,等级库文件应仅使用以下语言:

  • 蟒蛇

  • 波尔

  • shell编程中使用的标准程序,例如gawk或sed

  • Lua(由rpm中的本地Lua解释器支持)

此外,如果您的包没有特定的脚本语言(如Ruby或Tcl)就无法构建,因此该语言上已经有了BuildRequires,那么也可以从规范文件中调用它。

注意:如果在规范文件中调用Perl或Python(并且它还不是包的BuildRequires),则需要显式地为Perl或Cython添加BuildRequires。

%全球优先于%定义

使用%全球而不是%定义,除非在其他宏定义中确实只需要本地定义的子宏(这种情况非常罕见)。

理由:当两个宏定义语句处于rpm嵌套级别的顶层时,它们的行为相同。

但当它们用于嵌套宏展开时(如%{!?foo:…}构造,%定义理论上只持续到端撑(局部范围),而%全球定义具有全局范围。

请注意,%define和%global的区别不仅仅在于作用域:%defined宏的主体是延迟展开的(即在使用时),而%globol的主体是在定义时展开的。可以使用%%-转义来强制%global的惰性扩展。

处理区域设置文件

翻译文件可以由不同的程序针对不同的框架来处理。确保为正确的包添加BuildRequires:,否则包可能无法在buildroot中生成翻译文件。

如果包使用gettext进行翻译,请添加

构建要求:gettext

对于使用Linguist工具链的基于Qt的包,对于本地化实用程序,添加

构建要求:qt-level

如果您的语言环境文件足够少,可以全部放入一个包中,那么可以使用%查找语言宏。(如果您需要将软件包拆分为单独的语言包,请参阅langpack指南.)此宏将定位属于您的包的所有文件(按名称),并将此列表放入文件中。然后可以使用该文件来包含所有区域设置。%查找语言在所有文件都安装到buildroot之后,应该在spec文件的%install部分中运行。的正确语法%查找语言通常是:

%find_lang%{name}(查找长度%{name})

在某些情况下,应用程序可能会对其区域设置使用不同的“名称”。您可能需要查看区域设置文件并查看它们的名称。如果他们被命名我的app.mo,那么你需要通过我的应用程序%查找语言而不是%{名称}.之后%查找语言运行时,它将在活动目录中生成一个文件(默认情况下,是源目录的顶层)。此文件将根据您作为选项传递给%查找语言宏。通常,它会被命名%{name}.lang。然后应在%文件列表以包含检测到的区域设置%查找语言。为此,应将其与-f参数一起包含到%文件.

%文件-f%{name}.lang%{绑定}/foobar...

请注意%查找语言默认情况下搜索gettext区域设置,但它也可以处理Qt翻译、本地化的手册页和帮助文件。

处理放入的GNOME帮助文件/usr/share/gnome/help/使用

%find_lang%{name}--带名词

处理放入的KDE帮助文件/usr/share/doc/HTML/使用

%find_lang%{name}--带-kde

处理Qt.qm(平方米)二进制翻译文件使用

%find_lang%{name}--带-qt

要处理本地化的手册页(不包括默认的非本地化手册页),请使用

%find_lang%{name}--with-man

要查看所有选项,请运行/usr/lib/rpm/find-lang.sh在航站楼。

名称不同于%{名称}(例如,多个手册页)必须通过单独调用来处理%查找语言.

下面是正确使用%查找语言,英寸食品规格使用gettext和名为“bar”而不是“foo”的手册页本地化“foo“应用程序:

名称:foo...%准备%设置-q%建造%配置——带奶酪制作%{?_smp_mflags}%安装使DESTDIR=%{buildroot}安装%find_lang%{name}%find_lang栏--with-man%文件-f%{name}.lang-f bar.lang%许可证%文档自述文件%{绑定}/%{名称}%{曼迪尔}/man1/bar.1*%变更日志*2012年1月13日星期五Karel Volny<kvolny@redhat.com> 0.1-2-添加手册页示例*2006年5月4日星期四Tom“spot”Callaway<tcallawa@redhat.com> 0.1-1-使用%%find_lang的示例规范

为什么需要使用%find_lang?

使用%查找语言有助于使规范文件保持简单,并有助于避免其他几个打包错误。

  • 使用的程序包%{数据目录}/*要在一行中获取所有区域设置文件,还需要获取区域设置目录的所有权,这是不允许的。

  • 大多数具有区域设置的包都有许多区域设置。使用%查找语言在spec文件中比必须执行以下操作要容易得多:

%{_datadir}/locale/ar/LC_MESSAGES/%{name}.mo%{_datadir}/locale/be/LC_MESSAGES/%{name}.mo%{_datadir}/locale/cs/LC_MESSAGES/%{name}.mo%{_datadir}/locale/de/LC_MESSAGES/%{name}.mo%{_datadir}/locale/es/LC_MESSAGES/%{name}.mo...
  • 随着新的语言环境文件出现在以后的包修订中,%查找语言在运行时会自动包含它们,从而避免您必须更新规范。

请记住%查找语言包含区域设置的in包是必须的,除非区域设置文件被分解为langpack。在这种情况下,您应该遵循langpack指南.

日志文件

生成日志文件的包应在%{_localstatedir}/log下的包特定(和包拥有的)目录中写出其日志文件。除非要打包的软件旋转其自己的日志,否则它还必须附带一个logrotate配置文件来旋转其日志文件。

轮替配置文件

Logrotate配置文件的命名方式应与生成日志的守护程序/软件相匹配,后者通常(尽管并不总是)与包的名称相同。如果不确定,请使用“%{name}.conf”。这些文件必须放在%{_sysconfdir}/logrotate.d中,并且应该使用标准文件权限(0644)和所有权(root:root)。

由于这些是配置文件,因此必须在%文件列表中将其标记为%config(noreplace)。

示例Minimal轮替配置文件

/var/log/example/*log{missingok#如果日志文件丢失,则继续执行下一个日志文件,而不发出错误消息notifempty#如果日志文件为空,则不执行任何旋转compress#使用gzip压缩旧文件delaycompress#不压缩昨天的文件}

时间标记

在spec文件中添加文件复制命令时,请考虑使用保留文件时间戳的命令,例如。,cp-p安装-p.

下载源代码、补丁等时,请考虑使用保留上游时间戳的客户端。例如wget-北卷曲-R。要使wget的更改具有全局性,请将其添加到您的~/.dwg米:时间戳=开对于卷发,添加到您的~/.curlrc:-R(右).

平行制造

只要可能,调用制作应按照

%建造(_B)

这通常会加快构建速度,尤其是在SMP机器上。

但是,请确保包以这种方式干净地构建,因为某些make文件不支持并行构建。因此,您应该考虑添加

%_smp_mflags-j3

到您的~/.rpmmacros文件(甚至在UP机器上),因为这将暴露大多数错误。

脚本片断

在Fedora包中使用scriptlet时应格外小心。如果使用了scriptlet,那么这些scriptlet必须是健全的。记录了一些常见的scriptlet在这里.

脚本只允许写入某些目录

根据以下矩阵,程序包的生成脚本(%prep、%Build、%nstall、%check和%clean)只能更改%{buildroot}、%{_builddir}下的文件(创建、修改、删除)以及/tmp、/var/tmp(或由rpmbuild进程设置的$TMPDIR或%{_tmppath})等有效临时位置

/tmp、/var/tmp、$TMPDIR、%{_tmppath}

%{构建程序}

%{内置程序}

%准备

%建造

%安装

%检查

%清洁

进一步澄清:无论构建者的uid是什么,这都是正确的。

使用单独的用户帐户生成包

在构建尚未对其进行完整安全审核的软件时,请在单独的用户帐户中保护敏感数据,如GPG私钥。

这同样适用于评审员/测试人员。在无权访问任何敏感数据的单独帐户中重建src.rpms。

可重新定位的软件包

强烈反对使用RPM的设施生成可重定位的包。很难正常工作,无法从安装程序或yum使用,如果遵循其他打包准则,通常也不需要。然而,在不太可能的情况下,您有充分的理由使包可重新定位,您必须在包审查请求中说明这一意图和理由。

文件和目录所有权

您的软件包应该拥有作为%install过程一部分安装的所有文件。

在大多数情况下,不需要多个包包含同一文件的相同副本。但是,如果有必要,只要满足以下要求,多个包可能包含同一文件的相同副本:

  • 共享相同文件所有权的包是从单个SRPM构建的。

  • 共享相同文件所有权的包不在依赖链中(例如,如果包a需要包B,它们不应同时包含相同的文件,a或B必须拥有公共文件,但不能同时拥有两者。)

此外,相同的文件被定义为在每个包中的文件系统上的内容、校验和、权限和位置始终相同的文件。

一种值得注意的文件类型是许可证文本,它通常在子包之间以相同的方式共享。在某些情况下,需要跨包中的多个%files节复制许可证文本。有关更多详细信息,请参阅子包许可.

目录所有权比文件所有权稍微复杂一些。包必须拥有其放置文件的所有目录,但以下目录除外:

  • 拥有的任何目录文件系统,男人,或其他显式创建的-文件系统包装

  • 包的自然依赖链中其他包拥有的任何目录

在这种情况下,包的“自然依赖链”被定义为该包正常运行所必需的包集。具体地说,您不需要仅因为包拥有放置文件的目录而需要包。如果您的包由于其他原因已经需要该包,那么您的包不应该也拥有该目录。

在所有情况下,我们都会防止系统中出现无主目录。请参阅打包:未拥有的目录了解详细信息。

当共享目录时,您必须确保目录的所有权和权限在所有拥有它的包中匹配。

以下是描述如何处理大多数目录所有权情况的示例。

该目录完全包含在包中,或者涉及包的核心功能

例如:

gnucash将许多文件放在/usr/share/gnucash目录下

解决方案:gnucash公司包应该拥有/usr/share/gnucash目录

该目录还归实现包所需功能的包所有

例如:

pam拥有/etc/pam.d目录gdm将文件放在/etc/pam.d中gdm依赖pam正常工作,并且将Require:pam(隐式或显式)与目录所有权分离。

解决方案:聚丙烯酰胺程序包应拥有/等/pam。d日目录,和全球数据管理应该要求:这个聚丙烯酰胺包裹。

该目录由一个程序包拥有,而您的程序包不需要该程序包才能运行

一些包创建和拥有目录的目的是允许其他包存储适当的文件,但这些其他包不需要原始包才能正常运行。

例如:

gtk-doc拥有/usr/share/gtk-doc/目录evolution将文件放入/usr/share/gtk-doc/进化不需要gtk-doc才能正常运行。evolution的依赖链中没有任何东西拥有/usr/share/gtk-doc/

解决方案:进化包应该拥有/usr/share/gtk文档目录。没有必要仅为目录所有权在gtk-doc上添加显式Requires。

有时,这样的目录最好由“人工文件系统”包拥有,例如mozilla-files系统。当其他包在其目录中存储文件时,这些包被设计为显式需要,因此,在这种情况下,这些包应显式要求使用人工文件系统包,而不是乘法拥有这些目录。在决定是否创建人工文件系统包时,打包者应该考虑受影响的目录和包的数量,并使用自己的最佳判断来确定是否有必要这样做。

经验法则:确定此例外是否适用时,包装商和审核人员应提出以下问题:这个公共目录中的文件增强了吗或向另一个软件包添加功能,不需要其他包裹这个包的主要功能是什么?

您所依赖的提供目录的包可能会选择在更高版本中拥有不同的目录,并且您的包将在该更高版本下运行,而不会被修改

涉及Perl模块的示例:

假设perl-A-B型取决于珍珠-A并将文件安装到/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/A/B中。基本perl包保证只要与5.8.8版兼容,它就会拥有/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-threadmulti,但珍珠-A包可以安装到(并因此拥有)/usr/lib/perl5/vendor_perl/5.9.0/i386-linux-thread-multi/A中perl-A-B型软件包需要拥有/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/A以及/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/A/B,以便保持适当的所有权。

文件权限

必须正确设置文件权限。在/usr内部,文件应该归root:root所有,除非出于安全考虑需要更具体的用户或组。它们必须是通用可读的(如果合适,也可以执行)。在/usr之外,非配置和非状态文件应该由root:root所有,通用可读(如果合适,还可以执行),除非情况另有要求。

默认文件模式为0644或0755。目录应为模式0755。大多数行为良好的构建脚本和rpm将使用这些默认值。如果目录需要组可写,那么它还应该设置setgid位,以便在其中写入的文件属于该组。这些目录应具有模式2775。

只应在设置非默认值时使用%文件列表中的%defattr指令,或在设置了非默认值后重置为默认值。

Listas explícitas清单

包装工不应该只需在共享目录下对所有内容进行全局访问。

特别是以下内容不应该用于%文件:

  • %{绑定}/*

  • %{数据目录}/*

  • %{包含目录}/*

  • %{手动}/*

  • %{文档目录}/*

Esta rega服务于como uma verificaçáo conta erros comuns que,de outra forma,seriam difíceis de detectar。这是对自动化可能性的限制。

此规则防止的最常见错误是在上游添加新命令%{绑定}/*。您应该始终检查这些更改冲突,并保持此类文件的列表明确且可审核。

用户和组

一些软件包需要专用的运行时用户和/或组帐户,或从中受益。处理这些情况的指南见单独的文件.

请注意,为Fedora打包的系统服务不得作为没有人但必须分配自己的系统用户。

Web应用程序

打包在Fedora中的Web应用程序应该将其内容放在/usr/share/%{name}中,而不是放在/var/www/中。这样做是因为:

  • /var应该包含变量数据文件和日志/usr/share更适合于此。

  • 许多用户已经在/var/www中有了内容,我们不希望任何Fedora软件包超出此范围。

  • /文件系统层次结构标准不再指定var/www

冲突

只要有可能,Fedora包应该避免相互冲突。不幸的是,这并不总是可能的。有关Fedora冲突政策的详细信息,请参阅:冲突.

替代方案和环境模块等工具也可以帮助防止包冲突。

选择

“替代”工具提供了一种并行安装软件包的方法,这些软件包通过维护符号链接集来提供相同的功能。有关如何正确使用替代品的完整详细信息,请参阅选择.

环境模块

当存在多个变体,每个变体都满足某些用户的需求,因此必须同时供用户使用时,替代系统是不够的,因为它是全系统的。在这种情况下,使用环境模块可以避免冲突。有关如何正确使用环境模块的完整详细信息,请参阅环境模块.

修补程序指南

Fedora规范文件中的所有补丁应该对他们的上游地位发表评论。无论何时创建补丁,最好的做法是将其归档到上游bug跟踪器中,并在补丁上方的注释中包含指向该补丁的链接。例如:

# https://bugzilla.gnome.org/show_bug.cgi?id=12345补丁:gnome-paanel-fix-frobnicator.Patch

上述情况完全可以接受;但如果您愿意,可以简要介绍一下上述补丁的功能:

#不要使用frobnicator applet崩溃# https://bugzilla.gnome.org/show_bug.cgi?id=12345补丁:gnome-panel-fix frobnicator.Patch

向上游发送补丁并添加此评论将有助于确保Fedora是一个优秀的FLOSS公民(靠近上游项目). 它将通过了解新的上游版本中可能出现的补丁来帮助其他人(甚至您)进行软件包维护。

如果上游没有bug跟踪器

您可以指示已向上游发送修补程序以及任何已知状态:

#通过电子邮件发送至上游20080407补丁:foobar-fix-the-bar.Patch
#上游已将其应用于SVN中继补丁:foobar-fix-the-baz.Patch

Fedora特定(或拒绝的上游)补丁

可能有些补丁确实是针对Fedora的;在这种情况下,请这样说:

#在OpenJDK中实现长期System.loadLibrary修复之前,此修补程序是临时的修补程序:jna-jni-path.Patch

应用修补程序

通常,软件包的补丁应列在补丁号:标记,并使用%patch或%autosetup宏应用。然后必须将这些文件检入Fedora Package版本控制系统(目前是pkgs.fedoraproject.org上的git repo,通常通过fedpkg访问)。以这种方式存储文件允许人们使用标准工具来可视化文件修订之间的更改,并跟踪添加和删除操作,而无需使用间接层(就像将它们放在lookaside中一样)。

不允许直接从RPM_SOURCE_DIR应用修补程序。请参阅打包:RPM_Source_Dir了解完整的基本原理。

当包的上游提供了一个非常大的补丁或针对基本版本的补丁包时,维护人员可能会偏离此规则。在这种情况下,补丁的tarball可能被列为资料来源:行,然后使用常规的/usr/bin/patch命令应用分布式补丁。软件包的附加补丁(例如,由Fedora维护者生成以修复错误)仍必须列在补丁号:行,并在应用tarball中的补丁后由%patch宏应用。维护人员和审查人员在执行此例外时应谨慎,因为以补丁集形式发送更新可能意味着补丁集不是来自实际的上游,或者应该检查补丁的正确性,而不是简单地将其作为上游代码库。

Epochs的使用

RPM支持一个名为“Epoch:”的字段,这是一个数字字段,如果设置了该字段,则会为RPM添加另一个限定符,以用于进行包比较。具体来说,如果设置了,包的纪元胜过所有其他比较(除了更大的纪元)。如果包中没有设置Epoch,RPM会将其视为设置为0。

例子:

版本:1.2释放:3%{?dist}时代:1

具有这些定义的包将被视为大于具有更高版本或更高版本的包。由于Epoch让人困惑(并且一旦使用就无法从包装中移除),因此它只能在Fedora中使用作为最后的手段以解决软件包的升级顺序,并应尽可能避免。

此外,Epoch使正常的包装指南复杂化。如果软件包使用Epoch,则必须在以下任何地方引用它%{版本}-%{发布}使用。例如,如果依赖的包有一个Epoch,则在添加版本依赖项时必须列出:

需要:foo=%{epoch}:%{版本}-%{发布}

来自第三方存储库的Epochs

如果要导入的包现在或以前存在于可公开访问的存储库中,则打包程序可以选择包含与第三方包的最新版本相同的Epoch标记。

有两种制作符号链接的方法,一种是相对链接,另一种是绝对链接。在Fedora中,这两种方法都不需要。在决定哪种符号链接创建方法合适时,打包者应该使用他们的最佳判断。

相对符号链接是指向相对于符号链接位置的文件或目录的符号链接。例如,此命令将创建一个相对符号链接:

ln-s../..%{_binder}/foo%{buildroot}%{_bindir}/bar

赞成的意见:

  • 相对符号链接将指向chroot内部或外部的同一文件。

欺骗:

  • 创建比绝对符号链接复杂得多

  • 当文件系统的一部分安装到自定义位置时,相对符号链接可能会中断或出现意外行为。

  • 绑定装入或符号链接目录时,相对符号链接可能会断开。

  • 相对符号链接可能会使使用rpm系统宏更加困难。

绝对符号链接是指向绝对文件或目录路径的符号链接。例如,此命令将创建一个绝对符号链接:

ln-s%{_binder}/foo%{buildroot}%{_bunder}/bar

赞成的意见:

  • 比相对符号链接更容易创建。

  • 绑定装入或符号链接目录时,绝对符号链接可以正常工作。

  • 绝对符号链接适用于rpm系统宏。

欺骗:

  • 与chroot一起使用时,绝对符号链接可能会中断。

在某些情况下,替换目录的符号链接需要特殊处理。用任何类型的文件替换目录总是需要特殊处理。

请参见打包:目录替换获取有关执行此操作的信息。

测试套件

如果包的源代码提供了测试套件,则应在%检查部分,只要可行。

binfmt.d、sysctl.d和tmpfiles。d日

如果将sysctl配置片段foobar.conf安装到%{_sysctldir}(/usr/lib/sysctl.d/)中,则必须在%post节中调用%sysctl_apply:

%sysctl_apply foobar.conf

如果将binfmt配置代码段waldo.conf安装到%{_binfmtdir}(/usr/lib/binfmt.d/)中,则必须在%post节中调用%binfmt_apply:

%binfmt_apply waldo.conf文件

这样可以在安装软件包后立即进行适当的更改,而不需要重新启动或手动激活。

有处理tmpfiles.d配置和目录(在/run和/run/lock中)的特定准则:Tmp文件。d日.

重命名/替换或删除现有包

包重命名过程重命名现有包时应遵循。

如果需要重命名或替换现有包,新包应使更改在适用范围内对最终用户透明。

如果在没有任何功能更改的情况下重命名软件包,或者是对现有软件包的兼容-彻底替换(其中“足够”意味着它只包括版本升级更改中常见的重大更改),请提供干净的升级路径并与以下内容兼容:

提供:oldpackagename=$provEVR过时:oldpackagename<$obsEVR

$provEVR引用了一个(Epoch-)Version-Release元组,该元组是原始未更改的包在版本或发布被中断时所具有的元组。您通常在这里使用宏,因为提供的EVR应该随着重命名包的版本和发行版的进展而继续升级$obsEVR是一个(Epoch-)版本释放元组,它的安排使得有一个干净的升级路径,但不会无端地污染向上的版本空间。您通常不会使用宏来实现这一点,因为您只是试图超越以旧名称命名的上一个已知版本。

如果一个软件包取代/替换了现有的软件包,而不是上述充分兼容的替换软件包,则仅使用过时:行。

采取%{?分布}计入帐户:当决定$obsEVR应该是什么时,记住,它需要比以前高发布:,包括%{?分布}后缀。示例:如果包以前的发布标签为-4.fcNN公司,$obsEVR中指定的版本应至少为5。
如果更换的包使用rpmautospec公司,或者查看构建的包(例如在koji中)以找到最新构建的实际发布标签,或者使用rpmautospec计算发布只计算发布数量。

如果退役的软件包需要从最终用户机器中删除,因为它们会导致影响升级或其他有害的依赖性问题,则软件包管理员应要求过时:被添加到软呢帽过时包装。只需提交bugzilla票据在这里。请包括需要淘汰哪些软件包的信息,需要淘汰的确切版本,以及不允许继续安装的原因。

如果过时的软件包有一个Epoch集合,则必须将其保存在提供:过时:例如,假设foo被重命名为bar,bar与foo兼容,最后一个foo包版本是foo-1.0-3.fcNN具有纪元:2。应将以下内容添加到条形图中(如适用,所有子包装也应如此):

提供:foo=2:%{版本}-%{发布}#重要提示:我们将Obsoletes版本设置为4,以高于上次构建的foo过时:foo<2:1.0-4

明确的提供:需要知道包是否提供了可以在架构依赖或特定于架构的方式中使用的东西。对于非noarch的软件包,提供:应通过应用%{?isa}宏添加到Provides中文本字符串的末尾(例如。提供:foo%{?_isa}=2:%{版本}-%{发布}). 显式提供可以以arch-independent方式使用的内容的包(例如,那些依赖项不需要属于同一arch的包)不需要应用此宏。在某些情况下,一个包将提供多个元素,其中一些元素可能仅由同一拱门的家属使用,而另一些元素可能由任何拱门的亲属使用。在这种情况下,特定于体系结构和依赖于体系结构的Provides:都是有保证的。

只应显式提供特定于体系结构的包的示例提供:包括本机代码库或插件及其关联的-devel包。只应显式提供arch-independent的包提供:包括大多数独立程序(除所有noarch软件包外)。尽管这些程序本身可能是特定于arch的,但在大多数情况下,运行它们的客户不应该关心它们的arch。例如,显式提供本机代码库和该库的解释语言接口的包应同时具有特定于体系结构(对于本机代码库客户端)和依赖于体系结构的(对于解释语言接口客户端)provides:。

如果没有软件包的标准命名或与重命名相关的其他长期命名兼容性要求,则应假定Provides已弃用且寿命较短,并在下一个发行版之后的发行版中删除(即,如果在FC-X中引入,则保留发行版FC-X和FC-(X+1)的所有后续软件包修订版,放在FC-(X+2)中),以及计划将其放在其中的发行版,记录在规范文件的注释中。应通知并鼓励受影响包裹的维护人员改用新名称。向前兼容性提供:在较旧的发行版中,可以考虑使用分支,以便包维护人员可以在分支之间保留相同的简单规范文件,但仍可以切换到较新的名称。

对于通常不通过使用包名称作为依赖项来拉入的包,例如仅库包(通过库名称依赖项拉入),通常不需要添加Provides。但是请注意,lib包的-devel子包是使用包名称作为构建依赖项拉入的,因此在其中添加Provides通常是合适的。

描述和约定

存在一个过程,用于指示某个包已被弃用,并可能在将来离开分发版。请参见正在弃用程序包.

网络支持

如果应用程序包含对IPv4和IPv6的本机和稳定支持,并且对IPv6的支持不会对IPv4产生负面影响,则必须在Fedora软件包中启用这两种支持。

Cron文件

有关如何打包cron文件的详细信息,请参阅:Cron文件.

解决已知CVE问题的安全更新

如果包的更新解决了已知的安全问题(在更新时),并为其分配了常见漏洞和暴露(CVE)编号,则应在RPM更改日志条目中提及CVE编号。

构建时网络访问

Fedora构建系统中的包是在模拟chroot中构建的,无法访问互联网。软件包不得依赖或使用非其自身创建的任何网络资源(例如,用于测试)。在任何情况下,都不能从任何外部源下载源代码,只能从lookaside缓存和/或Fedora-git存储库下载。

引导

如果包引入了构建时循环依赖项,则应使用此宏引导包:

#当我们进行引导时,我们会删除一些依赖项和/或构建时测试。%bcond_with引导[...]%如果%{没有引导}#%%检查的依赖项构建要求:foo%结尾[...]%如果%{没有引导}%检查进行检查%结尾
自Fedora 30年以来,作为一个好的副作用,启用引导模式时,这个~引导后缀被附加到dist标记。这避免了通气释放的需要在引导和最终构建之间。您可以通过提交临时启用引导,发生了哪些变化%bcond_with引导%bcond_without引导然后恢复提交以进行最终构建。
自费多拉31日以来,可以禁用自动添加后缀通过指定%全局__bootstrap%{nil}在规范文件中。

如果您的包显式地提供:引导时缺少的一些功能提供:应如下所示:

%如果%{没有引导程序}提供:bar(some_functionality)%结尾

请注意,如中所述,在引导程序中使用预先构建的二进制文件仍然需要包装委员会的例外[一般例外政策].

系统加密策略

使用SSL或TLS加密协议的应用程序必须遵循加密货币政策.

Shebang线路

打包脚本文件时,在脚本的第一行(shebang行)中指定要使用的解释器#!,适用以下规则:

  • 环境价值,/箱子/环境/usr/bin/env不得使用。用于运行打包应用程序的解释器不能依赖于用户的个人信息$PATH(路径).

  • 未作为可执行文件安装的文件不应具有shebang行。

  • 特定于语言的指导原则可能有其他限制。

自动修改可执行脚本的Shebang行以将调用转换为环境价值直接使用中适当的可执行文件/usr/bin(用户/二进制)。还应用了各种检查来验证shebang行是否有效,因此构建过程可能会失败。最后,还可以进行其他特定于语言的修改。因此,通常不需要手动修改可执行脚本来修复环境价值只要启用此功能即可使用。

如果自动检查和修改破坏了包,则有两个主要选项:

  • 打包程序可以选择手动修复shebang行(使用补丁、通过sed编写脚本或其他类似方法)。

  • 打包程序可以从脚本中删除可执行权限,以便不进行检查和修改。

如果(并且仅当)脚本需要保持可执行状态,并且无法修改以通过检查,那么维护者可以选择禁用检查和修改。也可以通过设置%__brp_mangle_shebangs_exclude_from%__brp_mangle_shebangs_exclude分别使用与中描述的设置相同的语法打包:AutoProvidesAndRequiresFiltering。也可以通过添加%取消定义__brp_mangle_shebangs靠近规范文件的开头。

BRP(BuildRoot策略)脚本

BRP脚本在%安装(通过%__os安装后宏)并对安装在构建根目录中的文件执行一些自动健全性检查或调整。

所有包都应该始终受制于所有BRP脚本,但有时包需要选择退出某些脚本。只需定义相应的变量即可禁用任何BRP脚本%{无}。例如,要禁用brp-python字节编译脚本:

#关闭Python字节码编译,因为这是一个Jython#包,我们将生成JVM字节码%全局__brp_python_bytecompile%{nil}

任何以这种方式禁用BRP脚本的程序包都必须在附带的注释中注明原因。要查看默认运行的BRP脚本列表,请调用:

sed-r-n'/^%__os_install_post/,/%。?nil/p'/usr/lib/rpm/redhat/macros

要查看所有BRP脚本的列表,请调用:

rpmbuild--eval“%dump”|&grep“:__brp_”

消除构建不可复制性的常见来源

默认情况下调用的BRP脚本之一是%__os安装成本构建再现性。其目的是通过删除不需要的嵌入式元数据来规范已安装的文件,这些元数据依赖于生成环境,并可能导致来自同一源的不同生成不可复制。

请参见/usr/lib/rpm/macros.d/macros.build-replicability有关如何配置它的详细信息。

EPEL包装

在大多数情况下,这些指南和以下特定于应用程序的指南涵盖了Fedora和EPEL的包装。然而,必然存在一些差异。包装EPEL时,请同时咨询EPEL包装指南了解更多信息。