Line 1: |
Line 1: |
− | | + | {{Level|Developer}} |
| == .Spec file Notes == | | == .Spec file Notes == |
| | | |
| The "Recipe" for creating an RPM package is a spec file. Spec files end in the ".spec" suffix and contain the package name, version, RPM revision number, steps to build, install, and clean a package, and a changelog. Multiple packages can be built from a single RPM spec file, if desired. RPM packages are created from RPM spec files using the rpmbuild tool. | | The "Recipe" for creating an RPM package is a spec file. Spec files end in the ".spec" suffix and contain the package name, version, RPM revision number, steps to build, install, and clean a package, and a changelog. Multiple packages can be built from a single RPM spec file, if desired. RPM packages are created from RPM spec files using the rpmbuild tool. |
| | | |
− | Spec files are usually distributed within SRPM files, which contain the spec file packaged along with the source code. | + | Spec files are usually distributed within SRPM files, which contain the spec file packaged along with the source code. More information about building RPMs can be found at http://www.rpm.org/wiki/Docs#PackagerDocumentation |
| | | |
| # This is a revision of: | | # This is a revision of: |
Line 10: |
Line 10: |
| # This is an example spec file for SME Server rpm building. | | # This is an example spec file for SME Server rpm building. |
| # The Summary line is a single line description of the module. | | # The Summary line is a single line description of the module. |
− | === Summary: PackageName for SME Server === | + | ==== Summary: PackageName for SME Server ==== |
| | | |
| # anything starting with a % sign is a command that is interpreted by | | # anything starting with a % sign is a command that is interpreted by |
Line 24: |
Line 24: |
| # name is. If we were doing the SME Server specific bits in a separate RPM, | | # name is. If we were doing the SME Server specific bits in a separate RPM, |
| # we'd probably call it smeserver-PackageName | | # we'd probably call it smeserver-PackageName |
− | === %define name smeserver-PackageName === | + | ==== %define name smeserver-PackageName ==== |
| | | |
| # now you'll see how we refer to a value we've set previously. If we | | # now you'll see how we refer to a value we've set previously. If we |
| # did "%define foo bar" we can use "%{foo}" to insert "bar" in that | | # did "%define foo bar" we can use "%{foo}" to insert "bar" in that |
| # place. | | # place. |
− | === Name: %{name} === | + | ==== Name: %{name} ==== |
| | | |
| # and some more of the same with version and release numbers. | | # and some more of the same with version and release numbers. |
− | === %define version 1.0.0 === | + | ==== %define version 1.0.0 ==== |
− | === %define release 02 === | + | ==== %define release 02 ==== |
− | === Version: %{version} === | + | |
− | === Release: %{release} === | + | ==== Version: %{version} ==== |
| + | ==== Release: %{release}%{?dist} ==== |
| | | |
| # The copyright should be "GPL" for any contrib module you hope to | | # The copyright should be "GPL" for any contrib module you hope to |
| # make available for other SME Server users | | # make available for other SME Server users |
− | === Copyright: GPL === | + | |
| + | ==== Copyright: GPL ==== |
| | | |
| # The Group should indicate the type of application you're packaging. | | # The Group should indicate the type of application you're packaging. |
Line 45: |
Line 47: |
| # You can find a list of groups by looking at your current installed rpm | | # You can find a list of groups by looking at your current installed rpm |
| # package documentation: /usr/share/doc/rpm-x.x.x/GROUPS | | # package documentation: /usr/share/doc/rpm-x.x.x/GROUPS |
− | === Group: Networking/Daemons === | + | ==== Group: Networking/Daemons ==== |
| | | |
| # This is the name of the source file to use. Notice how we generate it | | # This is the name of the source file to use. Notice how we generate it |
| # based on the name and version we set earlier? | | # based on the name and version we set earlier? |
− | === Source: %{name}-%{version}.tar.gz === | + | ==== Source: %{name}-%{version}.tar.gz ==== |
| | | |
| # If you are using patch files, put some statements to define the | | # If you are using patch files, put some statements to define the |
Line 57: |
Line 59: |
| # where 'identity' references who you are, work for or represent. | | # where 'identity' references who you are, work for or represent. |
| # This could be your abreviated companyname or personal initials. | | # This could be your abreviated companyname or personal initials. |
− | === Patch0: smeserver-PackageName-1.0.0-02.dtm_patch === | + | ==== Patch0: smeserver-PackageName-1.0.0-02.dtm_patch ==== |
| | | |
| # The Packager is the name and email address of the person who packaged | | # The Packager is the name and email address of the person who packaged |
| # this software for SME Server, who may be a different person to the one | | # this software for SME Server, who may be a different person to the one |
| # who originally wrote it. | | # who originally wrote it. |
− | === Packager: Fred Foonly <foonly@example.com> === | + | ==== Packager: Fred Foonly <foonly@example.com> ==== |
| | | |
| # Where to do the work of building the RPMs. This should be a temporary | | # Where to do the work of building the RPMs. This should be a temporary |
| # directory unique to this package, hence we use the name, version and | | # directory unique to this package, hence we use the name, version and |
| # release values we set earlier to make up the directory name | | # release values we set earlier to make up the directory name |
− | === BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot === | + | ==== BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot ==== |
| | | |
| # What architectures do we want to build this for? Use "i386" if your | | # What architectures do we want to build this for? Use "i386" if your |
Line 74: |
Line 76: |
| # Perl and many web applications. Most SME Server management RPMs should | | # Perl and many web applications. Most SME Server management RPMs should |
| # be "noarch" | | # be "noarch" |
− | === BuildArchitectures: noarch === | + | ==== BuildArchitectures: noarch ==== |
| | | |
| # What software is required to build the RPM? This lets the RPM program | | # What software is required to build the RPM? This lets the RPM program |
Line 82: |
Line 84: |
| # software requires the package smeserver-devtools version 0.1-3 or higher | | # software requires the package smeserver-devtools version 0.1-3 or higher |
| # to run correctly. | | # to run correctly. |
− | === BuildRequires: smeserver-devtools >= 0.1-3 === | + | ==== BuildRequires: smeserver-devtools >= 0.1-3 ==== |
| | | |
| # What software is required for the RPM to run correctly once it's | | # What software is required for the RPM to run correctly once it's |
| # installed on a system? This has the same format as BuildRequires | | # installed on a system? This has the same format as BuildRequires |
− | === Requires: PackageName >= 2.2 === | + | ==== Requires: PackageName >= 2.2 ==== |
| | | |
| # typically, smeserver-PackageName will require PackageName, so you have to have | | # typically, smeserver-PackageName will require PackageName, so you have to have |
Line 94: |
Line 96: |
| # What software is required for the RPM to run correctly once it's | | # What software is required for the RPM to run correctly once it's |
| # installed on a system? This has the same format as BuildRequires | | # installed on a system? This has the same format as BuildRequires |
− | === Requires: PackageName >= 2.2 === | + | ==== Requires: PackageName >= 2.2 ==== |
| | | |
| # What software is obsolete and will be automatically uninstalled for this | | # What software is obsolete and will be automatically uninstalled for this |
| # RPM to run correctly once it's installed on a system? | | # RPM to run correctly once it's installed on a system? |
− | === Obsoletes: PackageName === | + | ==== Obsoletes: PackageName ==== |
| | | |
| # The provides tag is used to specify a ‘virtual package’ that the packaged | | # The provides tag is used to specify a ‘virtual package’ that the packaged |
| # software makes available when it is installed. Normally, this tag would | | # software makes available when it is installed. Normally, this tag would |
| # be used when different packages provide equivalent services. | | # be used when different packages provide equivalent services. |
− | === Provides: PackageName === | + | ==== Provides: PackageName ==== |
| | | |
| # This turns off automatic dependency processing that can sometimes | | # This turns off automatic dependency processing that can sometimes |
| # cause problems | | # cause problems |
− | === AutoReqProv: no === | + | ==== AutoReqProv: no ==== |
| | | |
| # The description is a slightly more verbose version of the summary | | # The description is a slightly more verbose version of the summary |
− | === %description === | + | ==== %description ==== |
− | === %name === | + | ==== %name ==== |
| # %name is an implementation of http://domain.com for the SME Server. | | # %name is an implementation of http://domain.com for the SME Server. |
| #This package has been integrated it into the SME Server and provides a | | #This package has been integrated it into the SME Server and provides a |
Line 118: |
Line 120: |
| # The changelog records changes made with each version. Make sure these | | # The changelog records changes made with each version. Make sure these |
| # are in exactly the right format, otherwise the RPM will not build. | | # are in exactly the right format, otherwise the RPM will not build. |
− | === %changelog === | + | ==== %changelog ==== |
| | | |
| * Tue Feb 20 2003 Fred Foonly <fred@example.com> | | * Tue Feb 20 2003 Fred Foonly <fred@example.com> |
Line 128: |
Line 130: |
| - [1.0.0-01] | | - [1.0.0-01] |
| - Original version | | - Original version |
− |
| + | |
| # The prep and setup sections describe what to do to prepare the source code | | # The prep and setup sections describe what to do to prepare the source code |
| # for building. For instance, this is where you would apply patches if | | # for building. For instance, this is where you would apply patches if |
| # you were using them. | | # you were using them. |
− | === %prep === | + | |
− | === %setup === | + | ==== %prep ==== |
− | ==== %patch0 -p1 ==== | + | |
| + | ==== %setup ==== |
| + | ===== %patch0 -p1 ===== |
| | | |
| # The build section lists commands to run as part of the build process | | # The build section lists commands to run as part of the build process |
| # This is where you can use a root/createlinks script to create events and | | # This is where you can use a root/createlinks script to create events and |
− | # action links. | + | # action links. see [http://wiki.contribs.org/Createlinks_example_script Createlinks_example_script] |
− | === %build === | + | # and [http://wiki.contribs.org/Esmith::Build::CreateLinks Esmith::Build::CreateLinks] for more information |
− | ==== perl createlinks ==== | + | |
| + | ==== %build ==== |
| + | # A cool way for creating a directory called '''tmp''' during the rpm installation |
| + | =====%{__mkdir_p} root/var/lib/packageName/tmp===== |
| + | or |
| + | %{__mkdir} -p $RPM_BUILD_ROOT/var/log/httpd-bkpc |
| + | |
| + | ===== perl createlinks ===== |
| | | |
| # The install section lists commands to run during the build phase to | | # The install section lists commands to run during the build phase to |
Line 149: |
Line 160: |
| # refer to the directory rpms/BUILD/yourappname/root (or whatever's set | | # refer to the directory rpms/BUILD/yourappname/root (or whatever's set |
| # in the BuildRoot line near the top of this spec file. | | # in the BuildRoot line near the top of this spec file. |
− | === %install === | + | |
| + | ==== %install ==== |
| # clean out the build root, to make sure nothing old is hanging around | | # clean out the build root, to make sure nothing old is hanging around |
| # in there | | # in there |
− | rm -rf $RPM_BUILD_ROOT
| |
− |
| |
| # now we generate a file list so we know what's in the RPM; see the | | # now we generate a file list so we know what's in the RPM; see the |
| # %files section below for how it's actually used | | # %files section below for how it's actually used |
| + | # A you can see below we set permissions and ownership on files and directories |
| + | # You can also ignore adding a directory with --ignoredir |
| + | |
| + | rm -rf $RPM_BUILD_ROOT |
| + | rm -f %{name}-%{version}-filelist |
| (cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) | | (cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) |
− | /bin/rm -f %{name}-%{version}-filelist | + | /sbin/e-smith/genfilelist \ |
− | /sbin/e-smith/genfilelist $RPM_BUILD_ROOT > %{name}-%{version}-filelist
| + | '''--dir /var/lib/packageName/tmp 'attr(0770,root,www)' \''' |
− | | + | --dir /var/service/tinydns 'attr(0755,root,root)' \ |
− | # This section will help clear out the build root before | + | --dir /var/service/tinydns/log 'attr(0755,root,root)' \ |
− | # building the RPM | + | --file /var/service/tinydns/run 'attr(0750,root,root)' \ |
− | === %clean === | + | --file /var/service/tinydns/tinydns-log.pl 'attr(0750,root,root)' \ |
− | rm -rf $RPM_BUILD_ROOT | + | --file /var/service/tinydns/tinydns-readstats 'attr(0750,root,root)' \ |
− |
| + | --file /var/service/tinydns/control/1 'attr(0750,root,root)' \ |
| + | --file /var/service/tinydns/control/2 'attr(0750,root,root)' \ |
| + | --file /var/service/tinydns/log/run 'attr(0750,root,root)' \ |
| + | --dir /var/log/tinydns 'attr(02755,dnslog,dnslog)' \ |
| + | --file /var/service/dhcp-dns/dhcp-dns 'attr(0750,root,root)' \ |
| + | --file /var/service/dhcp-dns/run 'attr(0750,root,root)' \ |
| + | --ignoredir /etc/sudoers.d \ |
| + | $RPM_BUILD_ROOT > %{name}-%{version}-%{release}-filelist |
| + | |
| + | # we can push file to a destination in order to use them after in a mysql.init script |
| + | # the file needs to be outside of the root/ of your rpm |
| + | # for example : |
| + | # my $dbstruct = `rpm -qd smeserver-packageName | grep packageName.sql`; |
| + | # /usr/bin/mysql $db < $dbstruct |
| + | |
| + | echo "%doc CHANGELOG.git" >> %{name}-%{version}-filelist |
| + | echo "%doc packageName.sql" >> %{name}-%{version}-filelist |
| + | |
| # Now we have to list all the files that are part of our installed RPM | | # Now we have to list all the files that are part of our installed RPM |
| # The %files statement lets us refer to an external file list that we | | # The %files statement lets us refer to an external file list that we |
| # just generated, which is easier than trying to list them all by hand | | # just generated, which is easier than trying to list them all by hand |
− | %files -f %{name}-%{version}-filelist
| + | |
| + | ==== %files -f %{name}-%{version}-filelist ==== |
| | | |
| # The following line lets us specify attributes for the files to | | # The following line lets us specify attributes for the files to |
Line 176: |
Line 209: |
| # you'll want to leave the permissions as they are, but make the files | | # you'll want to leave the permissions as they are, but make the files |
| # owned by user and group root | | # owned by user and group root |
− | %defattr(-,root,root)
| + | |
− | | + | ====%defattr(-,root,root)==== |
| + | ====%attr(755,root,root) /etc/e-smith/sql/init/sme8admin==== |
| + | |
| + | # This section will help clear out the build root before |
| + | # building the RPM |
| + | |
| + | ==== %clean ==== |
| + | rm -rf $RPM_BUILD_ROOT |
| + | |
| # The preun section lists commands to run prior to uninstalling the software | | # The preun section lists commands to run prior to uninstalling the software |
| # on the SME Server. This may mean things like signalling events or | | # on the SME Server. This may mean things like signalling events or |
| # running action scripts | | # running action scripts |
− | === %preun === | + | |
| + | ==== %preun ==== |
| | | |
| # The postun section lists commands to run after uninstalling the software | | # The postun section lists commands to run after uninstalling the software |
| # on the SME Server. This may mean things like signalling events or | | # on the SME Server. This may mean things like signalling events or |
| # running action scripts | | # running action scripts |
− | === %postun === | + | ==== %postun ==== |
| | | |
| # The pre section lists commands to run prior to installing the software | | # The pre section lists commands to run prior to installing the software |
| # on the e-smith system. This may mean things like signalling e-smith | | # on the e-smith system. This may mean things like signalling e-smith |
| # events or running action scripts | | # events or running action scripts |
− | === %pre === | + | ==== %pre ==== |
| + | /sbin/e-smith/create-system-user dns 53 "Name server" /var/service/tinydns /bin/false |
| + | /sbin/e-smith/create-system-user dnslog 411 "DNS log user" /var/log /bin/false |
| | | |
| # The post section lists commands to run after installing the software | | # The post section lists commands to run after installing the software |
| # on the e-smith system. This may mean things like signalling e-smith | | # on the e-smith system. This may mean things like signalling e-smith |
| # events or running action scripts | | # events or running action scripts |
− | === %post === | + | |
− | [[Category:Howto]]
| + | ==== %post ==== |
| + | |
| [[Category:SME Server Development Framework]] | | [[Category:SME Server Development Framework]] |
| [[Category:Development Tools]] | | [[Category:Development Tools]] |
| [[Category:SME9-Development]] | | [[Category:SME9-Development]] |