153

我只想创建一个 RPM 文件来分发我的 Linux 二进制“foobar”,只有几个依赖项。它有一个配置文件 /etc/foobar.conf,应该安装在 /usr/bin/foobar 中。

不幸的是,RPM 的文档长达27 章,我真的没有时间坐下来阅读,因为我还忙于为其他平台制作 .deb 和 EXE 安装程序。

创建 RPM 所需的绝对最低限度是多少?假设 foobar 二进制文件和 foobar.conf 在当前工作目录中。

4

9 回答 9

179

我经常在 Linux 上为每个打包专有应用程序执行二进制 rpm - 也最常见于 websphere。所以我的经验对你也很有用,除了如果可以的话,最好做一个真正的 RPM。但我离题了。

因此,打包(二进制)程序的基本步骤如下 - 我假设该程序是 1.0 版的 toybinprog,在 /etc/toybinprog/toybinprog.conf 中安装了一个 conf,并有一个要安装的 bin在 /usr/bin 中称为 tobinprog :

1. 为 RPM < 4.6,4.7 创建你的 rpm 构建环境

mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp}

cat <<EOF >~/.rpmmacros
%_topdir   %(echo $HOME)/rpmbuild
%_tmppath  %{_topdir}/tmp
EOF

cd ~/rpmbuild

2. 创建项目的压缩包

mkdir toybinprog-1.0
mkdir -p toybinprog-1.0/usr/bin
mkdir -p toybinprog-1.0/etc/toybinprog
install -m 755 toybinprog toybinprog-1.0/usr/bin
install -m 644 toybinprog.conf toybinprog-1.0/etc/toybinprog/

tar -zcvf toybinprog-1.0.tar.gz toybinprog-1.0/

3.复制到源目录

cp toybinprog-1.0.tar.gz SOURCES/

cat <<EOF > SPECS/toybinprog.spec
# Don't try fancy stuff like debuginfo, which is useless on binary-only
# packages. Don't strip binary too
# Be sure buildpolicy set to do nothing
%define        __spec_install_post %{nil}
%define          debug_package %{nil}
%define        __os_install_post %{_dbpath}/brp-compress

Summary: A very simple toy bin rpm package
Name: toybinprog
Version: 1.0
Release: 1
License: GPL+
Group: Development/Tools
SOURCE0 : %{name}-%{version}.tar.gz
URL: http://toybinprog.company.com/

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description
%{summary}

%prep
%setup -q

%build
# Empty section.

%install
rm -rf %{buildroot}
mkdir -p  %{buildroot}

# in builddir
cp -a * %{buildroot}


%clean
rm -rf %{buildroot}


%files
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%{_bindir}/*

%changelog
* Thu Apr 24 2009  Elia Pinto <devzero2000@rpm5.org> 1.0-1
- First Build

EOF

4.构建源码和二进制rpm

rpmbuild -ba SPECS/toybinprog.spec

就这样。

希望这有帮助

于 2009-07-22T13:21:08.413 回答
21

作为应用程序分销商,fpm 听起来非常适合您的需求。这里有一个例子展示了如何从源代码打包一个应用程序。FPM 可以生成 deb 文件和 RPM 文件。

于 2012-06-26T14:19:24.430 回答
17

要快速构建 RPM,请查看 Togo:

https://github.com/genereese/togo-rpm

该项目有一个快速入门指南,我能够在不到 3 分钟的时间内创建一个基本的 RPM。

使用原始问题中提供的数据的示例:

1)使用脚本创建项目目录:

$ togo project create foobar; cd foobar

2)在 ./root 下创建所需的目录结构并将文件复制到其中:

$ mkdir -p root/etc; cp /path/to/foobar.conf root/etc/
$ mkdir -p root/usr/bin; cp /path/to/foobar root/usr/bin/

3) 从您的 RPM 所有权中排除系统拥有的目录:

$ togo file exclude root/etc root/usr/bin

4)(可选)修改生成的规范以更改您的包描述/依赖项/版本/其他等:

$ vi spec/header

5) 构建 RPM:

$ togo build package

- 并且您的 RPM 被吐出到 ./rpms 目录中。

于 2013-09-17T02:54:55.927 回答
16

同样,我需要创建一个只包含几个文件的 rpm。因为这些文件是源代码控制的,而且看起来很傻,所以我不想为了让 rpm 解压它们而对它们进行去皮重处理。我想出了以下内容:

  1. 设置您的环境:

    mkdir -p ~/rpm/{BUILD,RPMS}

    echo '%_topdir %(echo "$HOME")/rpm' > ~/.rpmmacros

  2. 使用以下内容创建规范文件 foobar.spec:

    Summary: Foo to the Bar
    Name: foobar
    Version: 0.1
    Release: 1
    Group: Foo/Bar
    License: FooBarPL
    Source: %{expand:%%(pwd)}
    BuildRoot: %{_topdir}/BUILD/%{name}-%{version}-%{release}
    
    %description
    %{summary}
    
    %prep
    rm -rf $RPM_BUILD_ROOT
    mkdir -p $RPM_BUILD_ROOT/usr/bin
    mkdir -p $RPM_BUILD_ROOT/etc
    cd $RPM_BUILD_ROOT
    cp %{SOURCEURL0}/foobar ./usr/bin/
    cp %{SOURCEURL0}/foobar.conf ./etc/
    
    %clean
    rm -r -f "$RPM_BUILD_ROOT"
    
    %files
    %defattr(644,root,root)
    %config(noreplace) %{_sysconfdir}/foobar.conf
    %defattr(755,root,root)
    %{_bindir}/foobar
    
  3. 构建你的 rpm: rpmbuild -bb foobar.spec

那里有一些hackery将“源”指定为您的当前目录,但它似乎比替代方案更优雅,在我的情况下,它是编写一个单独的脚本来创建一个tarball等,等等。

注意:在我的特殊情况下,我的文件根据需要去的位置排列在文件夹中,如下所示:

./etc/foobar.conf
./usr/bin/foobar

所以准备部分变成了:

%prep
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT
cd $RPM_BUILD_ROOT
tar -cC %{SOURCEURL0} --exclude 'foobar.spec' -f - ./ | tar xf -

哪个更干净一些。

另外,我碰巧在 RHEL5.6 上,rpm 版本为 4.4.2.3,所以你的里程可能会有所不同。

于 2011-03-03T23:25:31.267 回答
5

从二进制构建 rpm 包的简单方法(这些步骤已使用 Fedora 18 进行了测试):

1)首先你必须安装rpmdevtools,所以运行这些命令(注意:以普通用户运行)

$ sudo yum install rpmdevtools rpmlint
$ rpmdev-setuptree

2) 在 ~/rpmbuild/SPECS 文件夹中创建新文件:package_name.spec

3)用编辑器(如gedit)打开它并写下:

Name:           package_name
Version:        1.0
Release:        1
Summary:        Short description (first char has to be uppercase)

License:        GPL
URL:            www. your_website/

BuildRequires:  package_required >= (or ==, or <=) 1.0.3 (for example)

%description
Description with almost 79 characters (first char has to be uppercase)

#This is a comment (just as example)

%files
/usr/bin/binary_file.bin
/usr/share/applications/package_name.desktop
/usr/share/pixmaps/package_name.png

%changelog
* date Packager's Name <packager's_email> version-revision
- Summary of changes

#For more details see: docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/Packagers_Guide/sect-Packagers_Guide-Creating_a_Basic_Spec_File.html

4) 制作 ~/rpmbuild/BUILDROOT/package_name-version-release.i386 并重现将放置文件的路径所以在这种情况下,例如创建:

  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/bin/
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/applications/
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/pixmaps/

5) 将要插入包中的文件放入这些文件夹中:

  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/bin/binary_file.bin
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/applications/package_name.desktop
  • ~/rpmbuild/BUILDROOT/package_name-version-release.i386/usr/share/pixmaps/package_name.png

usr/share/pixmaps/package_name.png 是二进制的图标 usr/share/applications/package_name.desktop 是在菜单项中插入程序的规则

6) package_name.desktop 必须是这样的:

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=example
GenericName=Short description
Comment=Comment of the application
Exec=package_name
Icon=package_name
Terminal=false
Categories=System;

类别如下:standards.freedesktop.org/menu-spec/latest/apa.html

7) 运行$ rpmbuild -bb ~/rpmbuild/SPECS/package_name.spec

8) 你的包被内置到 ~/rpmbuild/RPMS 文件夹中

如果您安装此软件包,则安装:

  • /usr/bin/binary_file.bin
  • /usr/share/applications/package_name.desktop
  • /usr/share/pixmaps/package_name.png

感谢:losurs.org/docs/tips/redhat/binary-rpms

有关构建 rpm 的更多详细信息,请查看此链接

GUI java软件构建rpm:https ://sourceforge.net/projects/javarpmbuilder/

于 2013-09-08T14:18:45.727 回答
4

如果make config适用于您的程序,或者您有一个将您的两个文件复制到适当位置的 shell 脚本,您可以使用checkinstall。只需转到您的 makefile 所在的目录并使用参数-R(对于RPM)和可选的安装脚本调用它。

于 2011-02-15T09:49:36.830 回答
-1

如果您熟悉 Maven,那里也rpm-maven-plugin简化了 RPM 的制作:您只需编写pom.xml将用于构建 RPM 的内容。RPM 构建环境由插件隐式创建。

于 2015-03-31T21:40:00.053 回答
-3

从源文件生成 RPM 的过程:

  1. 下载扩展名为.gz的源文件。
  2. 从 yum install 安装 rpm-build 和 rpmdevtools。(将生成 rpmbuild 文件夹...SPECS、SOURCES、RPMS .. 文件夹应在 rpmbuild 文件夹内生成)。
  3. 将源代码.gz 复制到 SOURCES 文件夹。(rpmbuild/SOURCES)
  4. 使用以下命令解压缩 tar 球。转到存在 tar 文件的 SOURCES 文件夹 :rpmbuild/SOURCES。命令:例如 tar -xvzf httpd-2.22.tar.gz httpd-2.22 文件夹将在同一路径下生成。
  5. 转到提取的文件夹,然后键入以下命令:./configure --prefix=/usr/local/apache2 --with-included-apr --enable-proxy --enable-proxy-balancer --with-mpm=worker - -enable-mods-static=all(.configure 可能会根据需要构建 RPM 的源而有所不同——我已经为需要 apr 和 apr-util 依赖包的 apache HTTPD 完成了)。
  6. 配置成功后运行以下命令:make
  7. 成功执行 od make 命令后运行:检查安装在同一文件夹中。(如果您没有 checkinstall 软件,请从网站下载最新版本) checkinstall 软件也有错误,可以通过以下方式解决:::::: 找到 checkinstallrc,然后使用 vim 命令将 TRANSLATE = 1 替换为 TRANSLATE=0。还要检查排除包:EXCLUDE="/selinux"
  8. checkinstall 将询问选项(如果您想为源文件构建 rpm,请输入 R)
  9. 完成的 .rpm 文件将构建在 rpmbuild/RPMS 文件内的 RPMS 文件夹中......一切顺利......
于 2016-03-21T12:42:46.430 回答
-4

RPM 通常是从源代码构建的,而不是二进制文件。

您需要编写包含如何配置和编译应用程序的规范文件;还有,哪些文件要包含在您的 RPM 中。

快速浏览一下手册就会发现,您需要的大部分内容都在第 8 章中介绍了——此外,由于大多数基于 RPM 的发行版都有可用的源代码,因此您可以查看大量不同方法的示例。

于 2009-05-18T23:24:26.650 回答