this one is a little bit complicated, but then after you do it, you'll think it's not that complicated
redhat comes with a utility called rpmbuild, which you can use to build an RPM. but you need to set up a bunch of things first for it all to work
the first thing you need to do is create an environment and specify the build area so that rpmbuild knows where to do its thing
its best to do this as a non-root user
$ mkdir -p ~/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS} $ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
the directory structure should look like
. ├── .rpmmacros ├── rpmbuild ├── BUILD ├── SPECS ├── SOURCES ├── RPMS └── SRPMS
SOURCES is where you put your source files
SPECS is where you put your spec file. these are your instructions for how you want rpmbuild to build the rpm
BUILD is the temporary space where rpmbuild combines your source files into an RPM
RPMS is where rpmbuild spits out the final RPM
SRPMS are source RPMs that you can use instead of SOURCES (i think)
the .rpmmacros file contains global macros, which are essentially variables you can pass to your rpmbuild. there are built-in macros like
%_prefix /usr %_sysconfdir /etc %_localstatedir /var %_infodir /usr/share/info %_mandir /usr/share/man %_initrddir %{_sysconfdir}/rc.d/init.d %_defaultdocdir %{_usr}/share/doc
and you can define your own like
#%define macro_name value %define major 2 # Accessing macro %{major}
the second thing to do is to put your source file(s) into SOURCES
the third thing to do is to create a spec file
$ vim ~/rpmbuild/SPECS/package.spec
%define __spec_install_post %{nil} %define debug_package %{nil} %define __os_install_post %{_dbpath}/brp-compress Summary: A very simple rpm package Name: package Version: 1.0 Release: 1 License: MIT Group: Development/Tools SOURCE0 : %{name}-%{version}.zip BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %description %{summary} %prep unzip %{SOURCE0} %build # empty section. %install # should reflect how directories will actually look, but must be done within the buildroot rm -rf %{buildroot} mkdir -p %{buildroot} cp -a * %{buildroot} %clean rm -rf %{buildroot} %files # set permissions on the files/directories created # %defattr(<file mode>, <user>, <group>, <dir mode>) # %attr(<mode>, <user>, <group>) file %defattr(-,root,root,-) # next indicates that the file in the package should be installed with extension .rpmnew if there is already a modified file with the same name on the installed machine %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf # this is the standard place to put binaries, relative to the build root %{_bindir}/* %changelog * Aug 27 2015 First Build EOF
as you can see, getting the spec file right is the most important step as it is basically the template for where you want files to be put when you install the rpm and what permissions and behaviour should follow
once you are ready, the last step is to actually run rpmbuild
$ rpmbuild -ba ~/rpmbuild/SPECS/package.spec # you can provide arguments too $ rpmbuild -ba --define "macro_name value" ~/rpmbuild/SPECS/package.spec
if all goes well, you'll have a shiny new rpm in the RPMS directory that you can take and install with
$ rpmbuild -Uvh mygroovyrpm.rpm