如果您已经使用Linux操作系统很长时间了,甚至对编程一点也不了解,那么您可能迟早需要从源代码编译该程序。 可能所需的程序将不在分发存储库中。 或者该程序在这些存储库中有旧版本,并且您需要最新版本。 或者,也许您创建了一个新程序并希望与其他用户共享。
当然,您可以根据源代码随附的说明安装程序。 但是随后您将需要手动管理程序文件并监视其依赖性。 最好使用程序构建程序包并使用操作系统中内置的应用程序管理器。
我希望本文能帮助您快速弄清楚如何为Rosa Linux或使用RPM软件包管理器的其他发行版(Mandriva,RedHat)构建RPM软件包。 或者至少告诉我在哪里寻找信息。
在这里,我将通过一个简单的示例展示如何在本地计算机上创建RPM软件包。 我们将在Rosa Linux操作系统中构建xkb-switch程序。 我们将从GitHub中获取程序的源代码。
关于Rosa Linux的一些知识
Rosa Linux是由俄罗斯开发人员创建并支持的发行版。 它基于Mandriva ,但具有一些功能。 我使用的是2014年发布的32位版本的Rosa Fresh R8 。 现在,开发人员不再支持R8版本(它的存储库未更新),但是在我的笔记本电脑上可以很好地工作,因此我不想安装新版本。
Rosa Fresh R8使用KDE4桌面。 分发软件包的所有版本都使用rpm
和urpm
管理器来管理带有应用程序的软件包,并且相应的命令是rpm
, urpmi
, urpme
, urpmq
和urpmf
。
在同一Linux发行系列中,软件包构建原则通常很少更改。 因此,本文中描述的内容应在Rosa发行版的所有版本中均适用。
与基于RPM的其他发行版相比,在Rosa Linux上构建软件包要简单一些。 有些点是自动的,不需要进行配置。
关于xkb-switch的一些知识
我喜欢将插件用于Vim文本编辑器xkbswitch的想法 ,关于该文章在Habré上有一篇文章 。 退出输入模式时,它将自动将键盘布局切换为英语,反之亦然-如果您再次进入输入模式,则切换为上一次输入文本的键盘布局。 为了使该插件正常工作,您需要使用xkb-switch程序,该程序可让您从命令行和Vim编辑器的插件中切换键盘布局。 该程序不在Rosa Linux R8存储库中(并且很可能没人会添加它,因为该发行版已经很旧,并且xkb-switch程序不是很流行)。
设置,完成,检查程序
通常,必须配置程序的编译以使其在特定发行版甚至特定系统中正常工作。 碰巧需要使用其他选项或某些特殊驱动程序的支持来构建程序。 或者,也许您想修复程序代码中的错误,或者只是检查它是否有效。 为此,最好在构建RPM软件包之前将源代码复制到您的计算机上,尝试对其进行编译并检查已编译程序的工作方式。
如果您确定不需要修改项目文件,则可以使用项目网站上的原始源代码并立即继续构建软件包。 但是,如果需要更改编译设置,通常比在源代码文件夹(即所谓的makefile )中更改文件要容易得多,然后再处理编译命令的选项和spec文件的内部宏设备。
在GitHub上没有您的个人资料的情况下检查源代码
如果您决定使用源代码或项目编译设置,但是在GitHub上没有自己的个人资料或不想使用它,则只需下载并解压缩源代码即可。 在我们的例子中,它可能看起来像这样(我将~/Projects/cpp
文件夹用于C ++源代码):
cd ~/Projects/cpp git clone https://github.com/ierton/xkb-switch.git
这将创建~/Projects/cpp/xkb-switch
文件夹,其中包含源代码。 当然git
您可以使用程序下载存档并解压缩,而不是使用git
。
从项目文件夹中的README.md
文件中,很容易猜出cmake
实用程序用于构建程序。 因此,如果您需要更改编译设置,在我们的情况下,它们位于CMakeLists.txt
文件中。 我们只是尝试编译该程序并检查它是否有效。 您需要为此使用的命令写在项目根目录的同一README.md
文件中。
cd xkb-switch mkdir build && cd build cmake .. make ./xkb-switch
之后,为了使用更改后的项目,您将必须从项目中清除或删除build
文件夹,并将源代码打包到存档中。 它可能看起来像这样:
cd ~/Projects/cpp/xkb-switch rm -rf ./build cd ~/Projects/cpp zip -r xkb-switch.zip xkb-switch
然后xkb-switch.zip
需要使用xkb-switch.zip
文件来生成软件包。
将项目保存到GitHub个人资料进行验证
我认为阅读本节的任何人至少对git的使用有点熟悉,并且已经在GitHub上建立了个人资料。 我认为这种方法是最好的,因此,除非另有说明,否则本文的其余部分将暗示已使用该方法。
首先,您需要将原始项目分叉到GitHub中 。 之后,像前面的方法一样,我们将项目克隆到我们的计算机上,但是从我们的存储库中克隆(在我的情况下,用户名是alexandersolovyov ):
cd ~/Projects/cpp git clone https://github.com/alexandersolovyov/xkb-switch.git
要添加任何更改,最好使用新分支。 然后,如果需要,可以使用该程序的不同版本。 而且还可以使用拉取请求向项目作者提出更改建议。 例如,如果您决定稍微修复CMakeLists.txt
文件,那么在此之前,您需要使用以下命令创建一个新分支:
git branch cmake_corrections
进行更改,检查并添加到分支后(使用git commit -am " "
),可以将新分支添加到GitHub:
git push origin cmake_corrections
之后,如有必要,您可以提出请求请求。
您可以链接到原始存储库:
git remote add ierton https://github.com/ierton/xkb-switch.git
然后更新存储库的主分支,使其与原始分支匹配:
git pull ierton master
构建RPM时,可以使用与更正后的分支相对应的程序代码。 为此,您将需要在spec文件中的表单中指定档案的地址:
Source0: https://github.com/-/-/archive/---.zip
但是, 正如specblog用户提示的那样 ,实际上并非如此。 最好以补丁的形式传达您的更改。 为此,您需要根据分支中的更改创建补丁文件,并将其复制到源文件夹以构建软件包( ~/rpmbuild/SOURCES/
)。 然后,您需要在规格文件中指定它们。 我们稍后会考虑,但是如果您愿意, 可以在这里阅读 。 如果您不知道如何创建补丁,则可以在扰流板下面查看。
如何使用git创建补丁创建补丁
补丁 ,它们是补丁 -这些文件中的更改记录在程序的源代码中。 如果不方便从远程存储库中“拉”出更改,或者项目的更改历史记录和使用它的原则使得最好使用补丁程序,它们可以用作git pull
和git push
命令的替代方法,以在本地代码存储库之间进行通信。
假设我们需要对CMakeLists.txt
文件进行更改。 首先,您需要执行如上所述的所有操作:我们的GitHub存储库中的master分支应对应于原始项目的main分支,并且对于您的更改,您需要使用cmake_corrections分支。 然后,您需要转到此分支,进行必要的更改,然后使用提交将其保存在git中。
现在,您需要将更改作为补丁文件保存到~/rpmbuild/SOURCES
文件夹(如果您未使用Rosa Linux,则SOURCES
文件夹的路径可能不同)。 例如,这(我的意思是我们在项目文件夹中,例如~/Projects/cpp/xkb-switch
,并且在cmake_corrections
分支上):
git format-patch -o ~/rpmbuild/SOURCES origin/master
git format-patch
命令为每次提交创建一个git format-patch
文件。 以这种形式,它将制作补丁程序,该补丁程序由最后一个参数指定的提交开始,并以当前分支的最后一次提交结束。 您可以以任何方式指定提交:在散列的开头,使用HEAD指针或分支名称(现在指示所需的提交)。 最主要的是, git log
执行git log
时可见的提交之一作为开始。 也就是说,您不能从另一个分支中的提交开始制作补丁。
您可以记住(或看到)我们从主分支分支返回的提交数量,并为一定数量的提交打补丁。 例如,如果我们进行了两次提交,则命令为:
git format-patch -o ~/rpmbuild/SOURCES -2
这里的提交次数是使用-2
设置的。 您可以指定任意数量的数字来代替该数字。
您可以通过在指向初始提交和最终提交的链接之间放置两点来指定提交补丁的提交范围:
git format-patch -o ~/rpmbuild/SOURCES master..cmake_corrections
每个补丁文件的名称均由序列号和提交注释的第一行组成。 因此,最好重命名每个文件,以便对补丁程序的描述更简短,更清楚地描述其本质。 例如,像这样:
mv 0001-Return-memory-allocated-by-XkbRf-getNamesProp()-for-tmp.patch 001-Fix-memory-leak.patch
关于规范文件语法的文章中补丁的命名约定建议在每个补丁文件的描述之前添加package_name-version-rosa- 。 如果您通过电子邮件发送补丁,而不是用于构建软件包,那么这也许是一个好习惯。 我们是在计算机上构建软件包的,因此最好在每次使用另一个程序或新版本的软件包~/rpmbuild/SOURCES
软件包之前,先清空~/rpmbuild/SOURCES
文件夹。
现在,如果需要更新主存储库分支( master )以使其与原始存储库分支匹配,则此后,将需要使用git rebase
来更新更改分支( cmake_corrections )。 您可以在此处查看如何执行此操作。 之后,将需要重新创建补丁。
准备“工作场所”以创建包
首先,您需要创建目录结构。 所有组装都在rpmbuild
主文件夹的rpmbuild
文件夹中进行。 创建初始目录结构,然后转到规格文件的文件夹:
mkdir -p ~/rpmbuild/SPECS && cd ~/rpmbuild/SPECS
对于Rosa Linux,这已经足够:其余文件夹将自动创建。
另一个发行版可能会使用其他文件位置来构建程序包。 也许您必须手动创建整个文件夹层次结构。 如果您不使用Rosa Linux,请查找有关发行的信息。 例如, 在Red Hat中可能看起来像这样 。
如果该软件包是用错误构建的,则不会删除rpmbuild
命令创建的所有文件-与成功构建相同。 我们将尝试多次收集软件包,而上次之后剩余的文件将受到干扰。 因此,最好制作一个简单的脚本来帮助快速删除它们。 创建cleanup.sh文件并将其放在~/rpmbuild/SPECS
。 其内容如下:
!
当然,最好使用chmod u+x cleanup.sh
为其添加执行权限。
如果您想从本地计算机上的文件中收集软件包-如果您不使用GitHub并对项目文件进行了更改,或者想从仅存储在计算机上的您自己的程序中创建一个软件包-您需要将该项目打包到一个档案中(例如.zip
, .tar
或.tar.gz
),然后将其放在SOURCES
文件夹中。 例如,像这样:
cd ~/Projects/cpp/ zip -r xkb-switch.zip xkb-switch mkdir -p ~/rpmbuild/SOURCES cp xkb-switch.zip ~/rpmbuild/SOURCES/
如果在构建程序后要构建另一个或相同但不同的版本,则需要从~/rpmbuild/SOURCES
文件夹中删除所有文件,然后将存档复制到该文件夹中(如果您不从GitHub下载)。补丁文件(如果使用)。 否则,很可能不会从GitHub下载存档文件(为什么-稍后再看),并且也很难弄清楚哪个补丁文件属于哪个程序。
让我们开始创建一个规范文件
构建RPM软件包的基础是所谓的斑点文件 。 该文件包含构建软件包所需的rpmbuild
程序(或rpm
)的说明。
在~/rpmbuild/SPECS/
创建xkb-switch.spec
文件。 最简单的开始方法是在模板规范文件网站上找到模板 。
从xkb-switch项目页面上的README
,可以知道该程序是使用cmake
实用程序编译的。 因此,我们将为使用CMake构建的程序选择Spec文件,然后将整个模板复制到我们的spec文件中。 当然,为了正确地组装我们的RPM软件包,我们需要对此模板进行很多更改。
关于规范文件语法的一些知识
- spec文件语法允许您添加bash样式的注释。
- 您可以使用空格作为同一行上的值之间的空格,以创建偶数列的外观,但是文档强烈建议使用制表符(一或两个,只要列是偶数)。 注意:在本文的所有代码示例中,仅使用空格,因此最好不要将所有文本从此处复制到规范文件中,而是自己打印。
- 选项字段由带有冒号的特殊选项名称和制表符(或空格)中的下一个值组成。 字段名称中字符的大小写无关紧要。 例如:
Name: xkb-switch
- 如果单词前面带有
%
符号(例如%description
),则这是一个特殊的关键字。 它可以是命令,宏或脚本调用。 然后,可以在其后指示其使用的参数。 并且有一些关键字指示命令或选项块的开始。 然后,可以在其旁边指示参数,并且在下一行应该有我在上一段中描述的命令或选项列表。 在这样的块之后,应留空行。
- 要使用常量的值,您需要在
%{_}
插入%{_}
形式的构造。 它的值可以是预定义的,也可以由选项(例如Name: xkb-switch
)或关键字%define
。 所有这些常量也被视为宏。 它们的使用将在下面更详细地讨论。
规格文件头
在spec文件中,标题始终是最先写入的。 这是适用于主RPM软件包的选项列表。 准备好包装后,查看其说明时将显示几乎所有这些信息。 以下是各行指示的内容:
总结:包装的简短说明。 我在
xkb-switch项目的
README.md
文件中监视了该描述:
Query and change XKB layout state
。
名称:包的名称。 在我们的例子中,这是
xkb-switch
。
版本号:程序版本。 要找出
CMakeLists.txt
,最好查看项目根文件夹中的
CMakeLists.txt
文件。 当然,您需要从将用于汇编的项目副本中获取文件。 如果您使用原始项目,则
可以直接在其GitHub页面上打开文件 。 如您所见,该版本由
MAJOR_VERSION
,
MINOR_VERSION
和
RELEASE_VERSION
。 我使用的程序版本为
1.6.0
。
发布:软件包本身的版本号。 显示何时组装具有相同版本程序的软件包。 在我们的例子中,这是“ 1”,因为没有人汇编过该版本的程序。 在理想情况下,如果我们已经尝试构建软件包并且程序集已到达末尾(即使有错误),那么在每次进行新的尝试后,您都需要将该数字增加1,同时不要从
rpmbuild/RPMS
和
rpmbuild/SRPMS
删除旧收集的软件包。 :接下来,将创建具有新内部版本号的新软件包。 如果您使用特殊的服务器进行组装,也许应该这样做。 我们使用计算机,而是清理文件夹。 如果包含此版本程序的软件包已在Linux发行版的存储库中,但您正在使用其他设置进行编译,则最好将发行号指定为1。
执照:程序分发所依据的许可证的简称。 根据Rosa Linux的规则,您只能使用允许免费分发的许可证来构建软件包。
README.md
可以从
README.md
文件中找到许可证是
GNU GPLv3 。 所以我们写:
GPLv3+
。
组别:程序所属的组或类别。 使用这些组,可以在应用程序启动菜单和窗口程序管理器中对程序进行排序(“添加或删除程序”)。
Rosa Linux的组列表可以在这里找到 。 我认为
Development\X11
最适合我们,因为该程序与X11相关,并且主要是为Vim创建脚本和插件所必需的。
网址:您可以在其中下载程序原始源代码的Internet地址。 在查看RPM软件包信息时将指定它。 此项是可选的,但我们将指出:
https://github.com/ierton/xkb-switch
:
https://github.com/ierton/xkb-switch
来源0:包含源代码的存档文件的名称,或可下载该文件的Internet地址。 如果您在Internet上指定地址,则在首次构建期间,文件将下载到
~/rpmbuild/SOURCES/
。 如果已经存在这样的文件,则将不再下载该文件,也就是说,
rpmbuild
程序将仅使用此URL末尾指定的文件名。 您可以仅指定文件名,但随后需要将其手动放置在
~/rpmbuild/SOURCES/
文件夹中。 最好在GitHub上提供项目副本的地址。 我使用了
https://github.com/alexandersolovyov/xkb-switch/archive/master.zip
文件。 您可以指定多个不同的源,以借助一个斑点文件从多个归档中收集源。 然后,在添加每个后续存档的选项的名称中,数量应增加(
Source1
,
Source2
等)。 当查看RPM软件包信息时,这些文件地址不可见。
补丁0:此选项不在模板文件中。 如果您决定以补丁程序的形式在程序的项目文件中传输更改,它可能会派上用场。 对于
Source0
选项,每个文件必须在单独的行中指示,并且选项名称末尾的数字必须每次增加。 修补程序文件应位于
~/rpmbuild/SOURCES
文件夹中(已下载源归档文件旁边)。 每个文件的名称都必须写成没有路径的文件。 不必在此处指定所有补丁文件-只有要应用的补丁文件可以。
构建要求:生成程序所需的软件包。 模板
cmake
。
CMakeLists.txt
文件指示用于组装的CMake的最低版本应不低于
2.6 ,因此最好指定
cmake >= 2.6
。 您可以使用单独的
BuildRequires:
选项添加其他程序包,每个程序包都放在单独的行上。 可以通过阅读项目的
README
并仔细查看
CMakeLists.txt
文件(尤其是
FIND_PACKAGE
,
TARGET_LINK_LIBRARY
和
FIND_PROGRAM
)来找到组装所需的软件包列表。 然后,您需要使用命令
urpmq -a __
在存储库中找到正确的软件包名称。 在我们的例子中,编译设置文件(
CMakeLists.txt
)已经包含用于检查系统中必要软件包是否存在的行。 但最好也在此处指定整个列表:
# CMake 2.6 BuildRequires: cmake >= 2.6 # C/C++ BuildRequires: gcc # libxkbfile BuildRequires: libxkbfile-devel # X11 libxkbfile, # libx11-devel . # man: BuildRequires: xz
需要:,提供:这些选项不在示例中,但有时可以派上用场。 它们在软件包之间建立依赖关系。
该选项Provides
指定要生成的软件包提供的功能。这可能是语言文件头的名称Ç,或动态链接库名,或者任何特殊功能。该选项Requires
指示该软件包依赖于其他软件包的功能。软件包管理器(rpm
,urpm
或谁使用发行人),搜索寻找这些依赖关系时的机会,而不是包名。因此,为了Provides
提供最佳的指定版本的功能,并为Requires
-提供什么版本的机会适应。版本用符号表示>=
,=
或<=
,由空格包围。通常,首先显示所有选项Requires
,然后显示- Provides
,即每行一个功能名称-与相同BuildRequires:
。通常,在Rosa Linux上构建软件包时,将自动识别依赖项,并且很少需要指定这些选项。AutoReq:,AutoProv:如果您正在构建使用rpm管理器是新语言或专有语言编写的程序,并且不能正确地自动检测依赖关系,则可以禁用对功能(带有AutoProv: no
)和/或依赖项(带有帮助AutoReq: no
)。%说明该块不再是标题的一部分,而是与其关联。他将在RPM软件包中添加对该程序的完整描述。其后应留空行。描述可以如下: %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley.
仅当您构建支持多种语言的应用程序时才需要模板中以%files
和开头的行%find_lang
,因此将其删除。
此外,在分隔行注释之后,接着是在打包文件之前必须完成的命令和宏。所有这些命令都分为使用特殊关键字定义的块。
来源准备
第一个是%prep
指示要准备编译的命令的块。它是一个宏命令%setup
。她运行一个脚本,该脚本执行以下操作:
- ,
SourceX:
( — Source0:
). , .
~/rpmbuild/SOURCES/
.
~/rpmbuild/BUILD/
.
- .
-q
, .
, %prep
:
rpmbuild -bp ~/rpmbuild/SPECS/xkb-switch.spec
rpmbuild
. , rpm
: rpmbuild
, . ( root
sudo
). rpmbuild
, man rpmbuild
. , , , — , rpmbuild
.
: xkb-switch-1.6.0: No such file or directory
. , ~/rpmbuild/BUILD/xkb-switch-1.6.0
, .
ls ~/rpmbuild/BUILD/
, xkb-switch-master
. %setup
-n
. %prep
- :
%prep %setup -q -n xkb-switch-master
~/rpmbuild/SPECS/cleanup.sh
, BUILD
, , %prep
. , exit 0
. , .
, . %prep
. , , :
%apply_patches
rpmbuild -bp xkb-switch.spec
. — .
Maximum RPM .
.
%build
. README
, cmake ..
make
, - . : , . , %build
:
~/rpmbuild/SPECS/cleanup.sh rpmbuild -bc ~/rpmbuild/SPECS/xkb-switch.spec
exit 0
: .
, . shell ( bash zsh, ). rpmbuild
, . shell - — . ( .)
- , , , %build
shell .
, , . cmake
, , , %cmake
- , , . ( — CMakeLists.txt
). , .
安装方式
, . %install
, , , ~/rpmbuild/BUILDROOT/__-buildroot/
.
__
, Name:
-, ( Version:
-), ( Release:
-), , .
README
, make install
, build
. - - %makeinstall_std -C build
, . ( , ):
~/rpmbuild/SPECS/cleanup.sh rpmbuild -bi ~/rpmbuild/SPECS/xkb-switch.spec
, RPM. - , .
, - . , ~/rpmbild/BUILDROOT/
. ( , , tree
, - Linux.) , , .debug
. , , : .
, , %files
-. , , . .
%files
-. , . Rosa Linux %prep
( - ). , , , , — . - (, , ).
%files
, RPM. , :
%files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz
-. , , /usr/lib/rpm/macros
. , %{_bindir}
, %{_libdir}
— , %{_mandir}
— man. %{name}
%{version}
Name:
Version:
-.
:
~/rpmbuild/SPECS/cleanup.sh rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec
… 2 1 . rpmlint
, . , , Rpmlint Errors , :
`xkb-switch.i586:E:名称不一致(错误:50)1`错误:库包名称中的版本未正确指定。`xkb-switch.i586:E:库中可执行文件包(Badness:1)/ usr / bin / xkb-switch`错误:库包中包含可执行文件。`xkb-switch.i586:W:非开发包中的开发文件/ usr / lib / libxkbswitch.so`警告在非开发包-devel
中找到了开发包文件()。一切都清楚了吗?我不这么认为。让我们仔细看看这里发生了什么。
什么是rpmlint
Rosa Linux rpmbuild
rpmlint
, . rpmlint
, , . , Rosa Linux ( , rpmlint
) .
, , . ~/rpmbuild/RPMS/_/
rpmlint -i __
.
, RPM - , , , , Rosa Linux, rpmlint -i __
.
RPM Rosa Linux
Rosa Linux 6 . , .
可执行程序包它是二进制的。它仅包含直接用于执行的二进制文件或脚本。这些软件包的文件通常安装在文件夹/bin/
或中/usr/bin
。也可能包含链接-用于使用几个不同名称调用程序的可能性。程序包的名称与程序的名称相对应。此类软件包通常取决于库。库包含程序使用的动态连接(“共享”,“共享”)库的编译文件。通常,这是库文件本身,其名称以版本结尾,并且指向该文件的链接,其名称以第一个版本号结尾。例如,对于库libxkbfile
版本1.0.2,它将是一个文件libxkbfile.so.1.0.2
及其链接,libxkbfile.so.1
。库软件包的名称(在安装程序的存储库中通过该名称进行识别)以第一个版本号结束,并以prefix开头lib
。该库具有libxkbfile
正确的名称- libxkbfile1
。这是由于通常只有在不兼容的库更改的情况下才会更改第一个版本号,因此,如果某些程序使用库的旧版本,而其他程序使用库的较新版本,则可以安装具有不同版本的库的多个软件包。开发人员软件包编译使用该库的程序所需的文件,而对于现成程序的工作则不必要的文件。对于简单的C / C ++程序,这是指向库文件的链接,但名称中没有版本(例如,libxkbfile.so
)以及头文件(扩展名为.h
)。包的名称结尾-devel
,例如:libxkbfile-devel
。在安装期间,它始终取决于适当的库。例如,包libxkbfile-devel
取决于libxkbfile1
。源代码Rosa Linux存储库具有RPM软件包,其中包含某些程序的源代码-大多数仅用于那些确实需要重建的程序。这些软件包的名称以-src
或结尾-source
(例如apache-source
)。rpmbuild
总是自动创建这样一个包并放入~/rpmbuild/SRPMS/
。调试符号这是可用于调试完成的程序的信息。它将已编译文件中的位置与源代码相关联。此类软件包由团队rpmbuild
自动创建,并为它们的名称指定了结尾-debuginfo
。我在Rosa Linux存储库中找不到此类软件包。文档Rosa Linux存储库具有用于各种程序和库的文档包。我(暂时)不了解构建此类软件包的功能。他们的名字通常最终在doc
:例如libx11-doc
,java-1.7.0-openjdk-javadoc
。顺便说一下,几乎所有文件都是按照网站样式制作的,要查看它们,最好打开浏览器,转到地址file:///usr/share/doc/
并选择所需的文件夹和文件。我们的结果
现在,一切都变得更加清晰了。
xkb-switch
libxkbswitch.so
, , , . , : xkb-switch.i586: W: devel-file-in-non-devel-package /usr/lib/libxkbswitch.so
.
- ,
/usr/lib/libxkbswitch.so.1
/usr/lib/libxkbswitch.so.1.6.0
. , . : xkb-switch.i586: E: executable-in-library-package (Badness: 1) /usr/bin/xkb-switch
.
- , (1). :
xkb-switch.i586: E: incoherent-version-in-name (Badness: 50) 1
.
, rpmlint
, . . xkb-switch , libxkbswitch.so.1.6.0
, Vim . xkb-switch , C C++ . RPM- .
-:
- xkb-switch Summary: Query and change XKB layout state Name: xkb-switch Version: 1.6.0 Release: 1 License: GPLv3+ Group: Development/X11 URL: https://github.com/ierton/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley. %files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build
— , . , , xkb-switch
3 : , . :
/usr/bin/xkb-switch
/usr/share/man/man1/xkb-switch.1.xz
,
- —
/usr/lib/libxkbswitch.so.1
/usr/lib/libxkbswitch.so.1.6.0
,
- —
/usr/lib/libxkbswitch.so
.
-. , ,
- Maximum RPM . - libxkbfile Rosa Linux .
.
— - libxkbfile . - :
%define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch
%define
. , ( ) — , . , %{major}
1
, .
%mklibname
«lib», , — ( ). %{libname}
«lib» + «xkbswitch» + ( %{major}) = libxkbswitch1
— .
-d
%mklibname
-devel
. %{develname}
libxkbswitch-devel
— .
Version:
Version: %{major}.6.0
, -.
- . . :
Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley.
- . - , - ( rpm ). %package
. -. , -. Version
, Summary
, Group
. Provides
Requires
, . Name
: , %package
.
. %description
— , %package
.
Rosa Linux - %description
-. libxkbswitch1
:
%package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'.
-n
%package
%description
, . - , xkb-switch-libxkbswitch1
. libxkbswitch1
. .
:
%package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'.
, . %files
.
, , %package
, %description
%files
. , %description
- . , , — xkb-switch
.
- Rosa Linux %files
, %prep
. :
%files %{_bindir}/%{name} %{_mandir}/%{name}.1.xz %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %files -n %{develname} %{_libdir}/libxkbswitch.so
, :
xkb-switch
~/usr/bin/xkb-switch
~/usr/share/man/man1/xkb-switch.1
,
libxkbswitch1
~/usr/lib/libxkbswitch.so.1
~/usr/lib/libxkbswitch.so.1.6.0
,
libxkbswitch-devel
~/usr/lib/libxkbswitch.so
.
cleanup.sh
rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec
. 3 :
libxkbswitch1.i586: W: no-documentation libxkbswitch-devel.i586: W: no-documentation libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch
, . , . . 让我们尝试找出答案。
, , , README.md
. %files
— %doc
:
%doc README.md
. %doc
— . ~/rpmbuild/BUILD/xkb-switdh-master/README.md
.
: libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch
. , libxkbswitch-devel
libxkbswitch
.
rpm -qp --
. :
[user@pc ~] $ cd ~/rpmbuild/RPMS/i586/ [user@pc ~/rpmbuild/RPMS/i586] $ ls libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-debuginfo-1.6.0-1-rosa2014.1.i586.rpm [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch.so.1 libxkbswitch1 = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libxkbswitch) libxkbswitch-devel = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libX11) devel(libgcc_s) devel(libstdc++) devel(libxkbfile) rpmlib(PayloadIsXz) <= 5.2-1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.11) libstdc++.so.6(GLIBCXX_3.4.20) libstdc++.so.6(GLIBCXX_3.4.9) libxkbswitch.so.1 rpmlib(PayloadIsXz) <= 5.2-1
, libxkbswitch1
libxkbswitch.so.1
libxkbswitch1
. xkb-switch
libxkbswitch.so.1
, libxkbswitch-devel
libxkbswitch1
. , %package
libxkbswitch-devel
. :
%package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version}
, … . libxkbswitch-devel
, , . , , rpmbuild
.
-, ( README.md
), — :
- %define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch # Main package. Automaticaly requires libxkbswitch and libxkbswitch-devel Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley. # libxkbswitch %package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'. # libxkbswitch-devel %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version} %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'. # xkb-switch %files %{_bindir}/%{name} %{_mandir}/man1/%{name}.1.xz # libxkbswitch1 %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %doc README.md # libxkbswitch-devel %files -n %{develname} %{_libdir}/libxkbswitch.so %doc README.md #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build
结论
, RPM Rosa Linux ( ). , -. , — , , rpmrc , ABF , — .
— , -, - , — .
rpmbuild -bp specfile.spec运行准备(%准备)。-bc的rpmbuild specfile.spec运行编译(%建立)和所有以前的操作。rpmbuild -bi specfile.spec执行伪安装(%安装)和所有前面的步骤。rpmbuild -ba specfile.spec完全构建软件包。检查成品包装
rpmlint -i package_file_name.rpm常规检查-软件包的构建情况。rpm -qp-提供package_filename.rpm检查软件包提供了哪些“功能”。rpm -qp-需要package_filename.rpm检查此软件包所依赖的其他软件包的“功能”。rpm -qpl package_file_name.rpm软件包中包含的文件列表。rpm -qpi package-file-name.rpm有关软件包的信息(来自spec文件的“标题”或%package块)。, p
. , Rosa Linux, . urpmq
, rpm -q
. , urpmq -l _
, urpmq --requires _
.
( )
- Building RPMs — Quick Start — RPM Rosa Linux.
- RPM — , , . .
- RPM: spec — - Rosa Linux.
- Maximum RPM —
rpm
RPM- RedHat Linux. , Rosa Linux. . - Template Spec Files —
.spec
. , -. - Automatic Build Farm (ABF) — Rosa Linux. , , ,
.spec
. -. - Rpmlint Errors — ,
rpmlint
. - Packaging Group — Rosa Linux.
- Rosa Linux .
- Git — — Git .