<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML ><HEAD ><TITLE >Create RPMs of Your Fonts</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" TITLE="Optimal Use of Fonts on Linux" HREF="index.html"><LINK REL="PREVIOUS" TITLE="Producing Portable Documents" HREF="portable.html"><LINK REL="NEXT" TITLE="Designer's Guide for Modern Good Looking Documents" HREF="typography.html"></HEAD ><BODY CLASS="section" 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" >Optimal Use of Fonts on Linux</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="portable.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="typography.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="rpm" ></A >6. Create <SPAN CLASS="acronym" >RPM</SPAN >s of Your Fonts</H1 ><P >Do not just throw <TT CLASS="filename" >.ttf</TT > files someplace on your system. It makes migrations more difficult, and makes a big mess in your computer. Package management software like <SPAN CLASS="acronym" >RPM</SPAN > lets you easily install your fonts in an organized standard way, manage font upgrades, and make massive font distribution a piece of cake.</P ><P >Here we'll provide templates and instructions for you to easily build <SPAN CLASS="acronym" >RPM</SPAN > packages of your fonts. We'll accept contributions with instructions to build different types of packages.</P ><DIV CLASS="section" ><H2 CLASS="section" ><A NAME="rpmmacro" ></A >6.1. Step 1: Prepare Your Environment to Build The Package</H2 ><P >To build <SPAN CLASS="acronym" >RPM</SPAN >s, you need a special structure of directories and some configurations on your environment. You should do everything as a regular user, in all steps. In fact, we recommend that you do not do this as <SPAN CLASS="acronym" >root</SPAN >.</P ><P >To create this directories, do this:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="screen" > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >cd ~</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >mkdir -p src/rpm</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >cd src/rpm</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >cp -r /usr/src/redhat/* .</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >ls</B > <TT CLASS="computeroutput" >BUILD/ RPMS/ SOURCES/ SPECS/ SRPMS/</TT > <TT CLASS="prompt" >bash$ </TT > </PRE ></FONT ></TD ></TR ></TABLE ><P >(the "~" is an alias to the current user's home directory name, and the command line knows it should interpret it this way)</P ><P >Of course this is on a Red Hat system, but the important point is to have the following directories under <TT CLASS="filename" >src/rpm</TT >:</P ><P ></P ><UL ><LI ><P > <TT CLASS="filename" >BUILD/</TT > </P ></LI ><LI ><P > <TT CLASS="filename" >RPMS/noarch/</TT > </P ></LI ><LI ><P > <TT CLASS="filename" >SRPMS/</TT > </P ></LI ></UL ><P >Then, you'll have to create the <TT CLASS="filename" >.rpmmacros</TT > file in you home directory, with this single line content:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="programlisting" > %_topdir YOUR_HOME_DIR_HERE/src/rpm </PRE ></FONT ></TD ></TR ></TABLE ><P >And you should substitute <TT CLASS="replaceable" ><I >YOUR_HOME_DIR_HERE</I ></TT > with the absolute name of your <TT CLASS="envar" >$HOME</TT > directory. So as an example, my <TT CLASS="filename" >.rpmmacros</TT > file contains this line:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="programlisting" > %_topdir /home/aviram/src/rpm </PRE ></FONT ></TD ></TR ></TABLE ></DIV ><DIV CLASS="section" ><H2 CLASS="section" ><A NAME="rpmtgz" ></A >6.2. Step 2: Prepare the Fonts Files to Package</H2 ><P >Now you must think about a name for your font collection. To make things easy in this documentation, we'll use the name <TT CLASS="replaceable" ><I >myfonts</I ></TT > from now on. Then you must create a directory named <TT CLASS="filename" >~/src/myfonts/myfonts</TT > (yes, <TT CLASS="filename" >myfonts</TT > two times) and put all your <TT CLASS="filename" >.ttf</TT > files right under it. So you'll have something like:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="screen" > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >cd ~/src</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >find myfonts/myfonts/</B > <TT CLASS="computeroutput" > myfonts/myfonts/ myfonts/myfonts/font1.ttf myfonts/myfonts/font2.ttf myfonts/myfonts/font3.ttf ... </TT > </PRE ></FONT ></TD ></TR ></TABLE ></DIV ><DIV CLASS="section" ><H2 CLASS="section" ><A NAME="rpmspec" ></A >6.3. Step 3: Create a <TT CLASS="filename" >.spec</TT > File With This Template</H2 ><P >To build an <SPAN CLASS="acronym" >RPM</SPAN > package you'll have to create a <TT CLASS="filename" >.spec</TT > file that provides instructions to the package builder on how to organize the files, package description, author, copyright, etc. We provide a template <A HREF="template.spec" TARGET="_top" >here</A > that you can use to start your work. The template looks like this:</P ><DIV CLASS="example" ><A NAME="spectemplate" ></A ><P ><B >Example 1. The <TT CLASS="filename" >.spec</TT > file template</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="programlisting" > Name: myfonts <A NAME="spectemplate.name" ><IMG SRC="../images/callouts/1.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(1)"></A > Summary: Collection of My Funny Fonts <A NAME="spectemplate.summary" ><IMG SRC="../images/callouts/2.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(2)"></A > Version: 1.1 <A NAME="spectemplate.version" ><IMG SRC="../images/callouts/3.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(3)"></A > Release: 1 License: GPL <A NAME="spectemplate.license" ><IMG SRC="../images/callouts/4.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(4)"></A > Group: User Interface/X Source: %{name}.tar.gz BuildRoot: %{_tmppath}/build-root-%{name} BuildArch: noarch Requires: freetype Packager: Avi Alkalay <avi unix sh> <A NAME="spectemplate.packager" ><IMG SRC="../images/callouts/5.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(5)"></A > Prefix: /usr/share/fonts Url: http://myfonts.com/ <A NAME="spectemplate.url" ><IMG SRC="../images/callouts/6.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(6)"></A > %description <A NAME="spectemplate.description" ><IMG SRC="../images/callouts/7.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(7)"></A > These are the fonts used in our marketing campaign, designed by our marketing agency specially for us. The package includes the following fonts: Font 1, Font 2, Font 3, Font 4. %prep %setup -q -n %{name} %build %install mkdir -p $RPM_BUILD_ROOT/%{prefix} cp -r %{name}/ $RPM_BUILD_ROOT/%{prefix} %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,0755) %{prefix}/%{name} %post { if test -x /sbin/conf.d/SuSEconfig.fonts ; then # This is a SUSE system. Use proprietary SuSE tools... if test "$YAST_IS_RUNNING" != "instsys" ; then if test -x /sbin/SuSEconfig -a -f /sbin/conf.d/SuSEconfig.fonts ; then /sbin/SuSEconfig --module fonts else echo -e "\nERROR: SuSEconfig or requested SuSEconfig module not present!\n" ; exit 1 fi fi if test -x /sbin/conf.d/SuSEconfig.pango ; then if test "$YAST_IS_RUNNING" != "instsys" ; then if test -x /sbin/SuSEconfig -a -f /sbin/conf.d/SuSEconfig.pango ; then /sbin/SuSEconfig --module pango else echo -e "\nERROR: SuSEconfig or requested SuSEconfig module not present!\n" ; exit 1 fi fi fi else # Use regular open standards methods... ttmkfdir -d %{prefix}/%{name} \ -o %{prefix}/%{name}/fonts.scale umask 133 /usr/X11R6/bin/mkfontdir %{prefix}/%{name} /usr/sbin/chkfontpath -q -a %{prefix}/%{name} [ -x /usr/bin/fc-cache ] && /usr/bin/fc-cache fi } &> /dev/null || : %preun { if [ "$1" = "0" ]; then cd %{prefix}/%{name} rm -f fonts.dir fonts.scale fonts.cache* fi } &> /dev/null || : %postun { if test -x /sbin/conf.d/SuSEconfig.fonts ; then # This is a SUSE system. Use proprietary SuSE tools... if test "$YAST_IS_RUNNING" != "instsys" ; then if test -x /sbin/SuSEconfig -a -f /sbin/conf.d/SuSEconfig.fonts ; then /sbin/SuSEconfig --module fonts else echo -e "\nERROR: SuSEconfig or requested SuSEconfig module not present!\n" ; exit 1 fi fi if test -x /sbin/conf.d/SuSEconfig.pango ; then if test "$YAST_IS_RUNNING" != "instsys" ; then if test -x /sbin/SuSEconfig -a -f /sbin/conf.d/SuSEconfig.pango ; then /sbin/SuSEconfig --module pango else echo -e "\nERROR: SuSEconfig or requested SuSEconfig module not present!\n" ; exit 1 fi fi fi else # Use regular open standards methods... if [ "$1" = "0" ]; then /usr/sbin/chkfontpath -q -r %{prefix}/%{name} fi [ -x /usr/bin/fc-cache ] && /usr/bin/fc-cache fi } &> /dev/null || : %changelog <A NAME="spectemplate.changelog" ><IMG SRC="../images/callouts/8.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(8)"></A > * Sun Apr 15 2007 Avi Alkalay <avi unix sh> 1.1 - Added support to SUSE on installation scriptlets * Thu Dec 14 2002 Avi Alkalay <avi unix sh> 1.0 - Tested - Ready for deployment * Thu Dec 10 2002 Avi Alkalay <avi unix sh> 0.9 - First version of the template </PRE ></TD ></TR ></TABLE ><P >You must change the following items to meet your package characteristic's (leave everything else untouched):</P ><DIV CLASS="calloutlist" ><DL COMPACT="COMPACT" ><DT ><A HREF="rpm.html#spectemplate.name" ><IMG SRC="../images/callouts/1.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(1)"></A ></DT ><DD >Put the name of your package or font collection here.</DD ><DT ><A HREF="rpm.html#spectemplate.summary" ><IMG SRC="../images/callouts/2.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(2)"></A ></DT ><DD >Put a brief summary about your package here.</DD ><DT ><A HREF="rpm.html#spectemplate.version" ><IMG SRC="../images/callouts/3.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(3)"></A ></DT ><DD >The version of the package.</DD ><DT ><A HREF="rpm.html#spectemplate.license" ><IMG SRC="../images/callouts/4.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(4)"></A ></DT ><DD >The usage license of your package here.</DD ><DT ><A HREF="rpm.html#spectemplate.packager" ><IMG SRC="../images/callouts/5.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(5)"></A ></DT ><DD >The name of the person responsible for this package here.</DD ><DT ><A HREF="rpm.html#spectemplate.url" ><IMG SRC="../images/callouts/6.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(6)"></A ></DT ><DD >URL to get more info about this package or fonts here. This entire line can be removed if there is no URL to point to.</DD ><DT ><A HREF="rpm.html#spectemplate.description" ><IMG SRC="../images/callouts/7.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(7)"></A ></DT ><DD >A more detailed description about this fonts here.</DD ><DT ><A HREF="rpm.html#spectemplate.changelog" ><IMG SRC="../images/callouts/8.gif" HSPACE="0" VSPACE="0" BORDER="0" ALT="(8)"></A ></DT ><DD >The evolution history of this package here. Must follow this layout.</DD ></DL ></DIV ></DIV ><P >This file must be named as the name of the package - <TT CLASS="filename" >myfonts.spec</TT > in our example. And you must put it under the main directory of the package. So in the end we'll have something like this:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="screen" > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >cd ~/src</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >find myfonts</B > <TT CLASS="computeroutput" >myfonts/ myfonts/myfonts.spec myfonts/myfonts/ myfonts/myfonts/font1.ttf myfonts/myfonts/font2.ttf myfonts/myfonts/font3.ttf ... </TT > </PRE ></FONT ></TD ></TR ></TABLE ></DIV ><DIV CLASS="section" ><H2 CLASS="section" ><A NAME="rpmbuild" ></A >6.4. Step 4: Build It</H2 ><P >We are almost ready to go. Next steps:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="screen" > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >cd ~/src</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >tar -czvf myfonts.tar.gz myfonts</B > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >rpmbuild -ta myfonts.tar.gz</B > </PRE ></FONT ></TD ></TR ></TABLE ><P >Done (after seeing a lot of messages about the building process). So we basically created a <TT CLASS="filename" >.tar.gz</TT > containing all our font files and <TT CLASS="filename" >myfonts.spec</TT >, and then we used <B CLASS="command" >rpmbuild</B > on it, that will look for <TT CLASS="filename" >myfonts.spec</TT > inside the archive and follow its instructions.</P ><P >You'll find the generated <SPAN CLASS="acronym" >RPM</SPAN > under <TT CLASS="filename" >~/src/rpm/RPMS/noarch/</TT > directory, and this is the file you'll deploy and install. Under <TT CLASS="filename" >~/src/rpm/SRPMS/</TT > you'll find the source <SPAN CLASS="acronym" >RPM</SPAN > file, which you should backup if you need to regenerate the deployable <SPAN CLASS="acronym" >RPM</SPAN > again in the future. When you'll need it, you should do:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><FONT COLOR="#000000" ><PRE CLASS="screen" > <TT CLASS="prompt" >bash$ </TT ><B CLASS="command" >rpmbuild --rebuild myfonts-1.0-1.src.rpm</B > </PRE ></FONT ></TD ></TR ></TABLE ><P >And the <SPAN CLASS="acronym" >RPM</SPAN > file will be generated again.</P ><P >For more information and advanced <SPAN CLASS="acronym" >RPM</SPAN > packaging, read the <A HREF="http://www.rpm.org/max-rpm/" TARGET="_top" >Maximum RPM</A > book, available in many formats in the <A HREF="http://www.rpm.org" TARGET="_top" >rpm.org site</A >.</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="portable.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="typography.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Producing Portable Documents</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" > </TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Designer's Guide for Modern Good Looking Documents</TD ></TR ></TABLE ></DIV ></BODY ></HTML >