2.12. Building a Software Collection
If you have correctly converted a conventional spec file for your Software Collection as documented in Section 2.10, “Converting a Conventional Spec File”, you will be able to build the resulting package in both the Software Collection and conventional build roots. Building the converted package in a conventional build root will produce a conventional base system RPM package, while building in a Software Collection build root that contains %{scl}-build will produce a Software Collection package.
To build a Software Collection on your system, run the following command:
rpmbuild -ba package.spec --define 'scl name'
The difference between the command shown above and the standard command to build conventional packages (
rpmbuild -ba package.spec
) is that you have to append the --define
option to the rpmbuild
command when building a Software Collection.
The
--define
option defines the scl
macro, which uses the Software Collection configured in the Software Collection spec file (package.spec
).
Alternatively, to be able to use the standard command
rpmbuild -ba package.spec
to build the Software Collection, specify the following in the package.spec
file:
BuildRequires: software_collection-build
where software_collection is the name of the Software Collection.
2.12.1. Rebuilding a Software Collection without build Subpackages
When you want to rebuild a Software Collection that comes with no build subpackage (software_collection-build), you can create the build subpackage by rebuilding the Software Collection metapackage, and thus avoid using the
rpmbuild -ba package.spec --define 'scl name'
command.
Note that you need to have the scl-utils-build package installed on your system, otherwise rebuilding the Software Collection metapackage with the
rpmbuild
command will fail.
For more information about the scl-utils-build package, see Section 1.3, “Enabling Support for Software Collections”.
2.12.2. Avoiding debuginfo File Conflicts
When you build two Software Collection packages (or a conventional RPM package and a Software Collection package) that specify the same
Source
tag, and thus unpack source files into the same directory underneath the %_builddir
directory, their debuginfo
packages will have file conflicts. Due to these conflicts, the user will be unable to install both packages on the same system at the same time.
To avoid these file conflicts, the spec file of one of the packages has to be altered to unpack its upstream source into a uniquely named top directory. This adds one more directory level to the build tree underneath the
%_builddir
directory. By doing so, the debuginfo
package generation script produces debuginfo
files that do not conflict with files from the other debuginfo
package.
To see what the diff file comparing an original spec file with an altered spec file looks like, refer to the following example:
--- a/tbb.spec +++ b/tbb.spec @@ -66,11 +66,13 @@ PDF documentation for the user of the Threading Building Block (TBB) C++ library. %prep -%setup -q -n %{sourcebasename} +%setup -q -c -n %{name} +cd %{sourcebasename} %patch1 -p1 %patch2 -p1 %build +cd %{sourcebasename} %{?scl:scl enable %{scl} - << \EOF} make %{?_smp_mflags} CXXFLAGS="$RPM_OPT_FLAGS" tbb_build_prefix=obj %{?scl:EOF} @@ -81,6 +83,7 @@ done %install rm -rf $RPM_BUILD_ROOT +cd %{sourcebasename} mkdir -p $RPM_BUILD_ROOT/%{_libdir} mkdir -p $RPM_BUILD_ROOT/%{_includedir} @@ -108,20 +111,20 @@ done %files %defattr(-,root,root,-) -%doc COPYING doc/Release_Notes.txt +%doc %{sourcebasename}/COPYING %{sourcebasename}/doc/Release_Notes.txt %{_libdir}/*.so.2 %files devel %defattr(-,root,root,-) -%doc CHANGES +%doc %{sourcebasename}/CHANGES %{_includedir}/tbb %{_libdir}/*.so %{_libdir}/pkgconfig/*.pc %files doc %defattr(-,root,root,-) -%doc doc/Release_Notes.txt -%doc doc/html +%doc %{sourcebasename}/doc/Release_Notes.txt +%doc %{sourcebasename}/doc/html %changelog * Wed Nov 13 2013 John Doe <jdoe@example.com> - 4.1-5.20130314