554 lines
9.8 KiB
HTML
554 lines
9.8 KiB
HTML
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>Building It</TITLE
|
|
><META
|
|
NAME="GENERATOR"
|
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
|
"><LINK
|
|
REL="HOME"
|
|
TITLE="RPM HOWTO"
|
|
HREF="index.html"><LINK
|
|
REL="PREVIOUS"
|
|
TITLE="Building RPMs"
|
|
HREF="build.html"><LINK
|
|
REL="NEXT"
|
|
TITLE="Multi-architectural RPM Building"
|
|
HREF="multi-arch.html"></HEAD
|
|
><BODY
|
|
CLASS="SECT1"
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#840084"
|
|
ALINK="#0000FF"
|
|
><DIV
|
|
CLASS="NAVHEADER"
|
|
><TABLE
|
|
SUMMARY="Header navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TH
|
|
COLSPAN="3"
|
|
ALIGN="center"
|
|
>RPM HOWTO: </TH
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="left"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="build.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="80%"
|
|
ALIGN="center"
|
|
VALIGN="bottom"
|
|
></TD
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="right"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="multi-arch.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"></DIV
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><H1
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="BUILD-IT">7. Building It</H1
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="SOURCE-TREE">7.1. The Source Directory Tree</H2
|
|
><P
|
|
> The first thing you need is a properly configured build tree. This is
|
|
configurable using the <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>/etc/rpmrc</SPAN
|
|
> file. Most
|
|
people will just use <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>/usr/src</SPAN
|
|
>.
|
|
</P
|
|
><P
|
|
> You may need to create the following directories to make a build
|
|
tree:
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>BUILD</SPAN
|
|
> is the directory where all building
|
|
occurs by RPM. You don't have to do your test building anywhere in
|
|
particular, but this is where RPM will do it's building.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>SOURCES</SPAN
|
|
> is the directory where you should
|
|
put your original source tar files and your patches. This is where
|
|
RPM will look by default.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>SPECS</SPAN
|
|
> is the directory where all spec files
|
|
should go.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>RPMS</SPAN
|
|
> is where RPM will put all binary RPMs
|
|
when built.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>SRPMS</SPAN
|
|
> is where all source RPMs will be put.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="TEST-BUILD">7.2. Test Building</H2
|
|
><P
|
|
> The first thing you'll probably want to to is get the source to build
|
|
cleanly without using RPM. To do this, unpack the sources, and change
|
|
the directory name to $NAME.orig. Then unpack the source again.
|
|
Use this source to build from. Go into the source directory and follow
|
|
the instructions to build it. If you have to edit things, you'll need a
|
|
patch. Once you get it to build, clean the source directory. Make sure
|
|
and remove any files that get made from a <B
|
|
CLASS="COMMAND"
|
|
>configure</B
|
|
>
|
|
script. Then <B
|
|
CLASS="COMMAND"
|
|
>cd</B
|
|
> back out of the source directory to
|
|
its parent. Then you'll do something like:
|
|
</P
|
|
><TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>diff -uNr dirname.orig dirname > ../SOURCES/dirname-linux.patch
|
|
</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><P
|
|
> This will create a patch for you that you can use in your spec file.
|
|
Note that the "linux" that you see in the patch name is just an
|
|
identifier. You might want to use something more descriptive like
|
|
"config" or "bugs" to describe <EM
|
|
>why</EM
|
|
> you had to
|
|
make a patch. It's also a good idea to look at the patch file you are
|
|
creating before using it to make sure no binaries were included by
|
|
accident.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="GENERATE-FILE">7.3. Generating the File List</H2
|
|
><P
|
|
> Now that you have source that will build and you know how to do it,
|
|
build it and install it. Look at the output of the install sequence and
|
|
build your file list from that to use in the spec file. We usually
|
|
build the spec file in parallel with all of these steps. You can create
|
|
the initial one and fill in the easy parts, and then fill in the other
|
|
steps as you go.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="BUILD-PKG">7.4. Building the Package with RPM</H2
|
|
><P
|
|
> Once you have a spec file, you are ready to try and build your
|
|
package. The most useful way to do it is with a command like the
|
|
following:
|
|
</P
|
|
><TABLE
|
|
BORDER="0"
|
|
BGCOLOR="#E0E0E0"
|
|
WIDTH="100%"
|
|
><TR
|
|
><TD
|
|
><FONT
|
|
COLOR="#000000"
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>rpm -ba foobar-1.0.spec
|
|
</PRE
|
|
></FONT
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><P
|
|
> There are other options useful with the <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>-b</I
|
|
></TT
|
|
> switch as well:
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>p</I
|
|
></TT
|
|
> means just run the
|
|
<SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>prep</SPAN
|
|
> section of the specfile.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>l</I
|
|
></TT
|
|
> is a list check that does
|
|
some checks on <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>%files</SPAN
|
|
>.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>c</I
|
|
></TT
|
|
> do a prep and compile. This
|
|
is useful when you are unsure of whether your source will build at
|
|
all. It seems useless because you might want to just keep playing
|
|
with the source itself until it builds and then start using RPM, but
|
|
once you become accustomed to using RPM you will find instances when
|
|
you will use it.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>i</I
|
|
></TT
|
|
>do a prep, compile, and
|
|
install.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>b</I
|
|
></TT
|
|
> prep, compile, install, and
|
|
build a binary package only.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>a</I
|
|
></TT
|
|
>build it all (both source and
|
|
binary packages).
|
|
</P
|
|
></LI
|
|
></UL
|
|
><P
|
|
> There are several modifiers to the <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>-b</I
|
|
></TT
|
|
> switch. They are as follows:
|
|
</P
|
|
><P
|
|
></P
|
|
><UL
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>--short-circuit</I
|
|
></TT
|
|
> will skip
|
|
straight to a specified stage (can only be used with c and i).
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>--clean</I
|
|
></TT
|
|
> removes the build tree
|
|
when done.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>--keep-temps</I
|
|
></TT
|
|
> will keep all the
|
|
temp files and scripts that were made in /tmp. You can actually see
|
|
what files were created in /tmp using the <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>-v</I
|
|
></TT
|
|
> option.
|
|
</P
|
|
></LI
|
|
><LI
|
|
STYLE="list-style-type: disc"
|
|
><P
|
|
> <TT
|
|
CLASS="PARAMETER"
|
|
><I
|
|
>--test</I
|
|
></TT
|
|
> does not execute any
|
|
real stages, but does keep-temp.
|
|
</P
|
|
></LI
|
|
></UL
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="TESTING-IT">7.5. Testing It</H2
|
|
><P
|
|
> Once you have a source and binary rpm for your package, you need to test
|
|
it. The easiest and best way is to use a totally different machine from
|
|
the one you are building on to test. After all, you've just done a lot
|
|
of <B
|
|
CLASS="COMMAND"
|
|
>make install</B
|
|
>'s on your own machine, so it should
|
|
be installed fairly well.
|
|
</P
|
|
><P
|
|
> You can do an <B
|
|
CLASS="COMMAND"
|
|
>rpm -e packagename</B
|
|
> on the package to
|
|
test, but that can be deceiving because in building the package, you did
|
|
a <B
|
|
CLASS="COMMAND"
|
|
>make install</B
|
|
>. If you left something out of your
|
|
file list, it will not get uninstalled. You'll then reinstall the
|
|
binary package and your system will be complete again, but your rpm
|
|
still isn't. Make sure and keep in mind that just because you do a
|
|
<B
|
|
CLASS="COMMAND"
|
|
>rpm -ba package</B
|
|
>, most people installing your package
|
|
will just be doing the <B
|
|
CLASS="COMMAND"
|
|
>rpm -i package</B
|
|
>. Make sure you
|
|
don't do anything in the <SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>build</SPAN
|
|
> or
|
|
<SPAN
|
|
CLASS="SYSTEMITEM"
|
|
>install</SPAN
|
|
> sections that will need to be done when
|
|
the binaries are installed by themselves.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="WHAT-TO-DO">7.6. What to do with your new RPMs</H2
|
|
><P
|
|
> Once you've made your own RPM of something (assuming its something that
|
|
hasn't already been RPM'ed), you can contribute your work to others
|
|
(also assuming you RPM'ed something freely distributable). To do so,
|
|
you'll want to upload it to <A
|
|
HREF="ftp://ftp.redhat.com"
|
|
TARGET="_top"
|
|
>ftp.redhat.com</A
|
|
>.
|
|
</P
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="WHAT-NOW">7.7. What Now?</H2
|
|
><P
|
|
> Please see the above sections on Testing and What to do with new RPMs.
|
|
We want all the RPMs available we can get, and we want them to be good
|
|
RPMs. Please take the time to test them well, and then take the time to
|
|
upload them for everyone's benefit. Also, <EM
|
|
>please</EM
|
|
>
|
|
make sure you are only uploading <EM
|
|
>freely available
|
|
software</EM
|
|
>. Commercial software and shareware should
|
|
<EM
|
|
>not</EM
|
|
> be uploaded unless they have a copyright
|
|
expressly stating that this is allowed. This includes ssh, pgp, etc.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="NAVFOOTER"
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"><TABLE
|
|
SUMMARY="Footer navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="build.html"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="index.html"
|
|
ACCESSKEY="H"
|
|
>Home</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="multi-arch.html"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
>Building RPMs</TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
> </TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>Multi-architectural RPM Building</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |