lfs-uefi: fix efivar-37 FTBFS
[linux_from_scratch_hints.git] / PREVIOUS_FORMAT / encap.txt
blobc4403844e59c1655275779bf0121ecf582ab2a7e
1 TITLE:          Encap/ePkg Package Management
2 LFS VERSION:    20020912
3 AUTHOR:         Andre Masella - andre at masella.dynodns.net
5 SYNOPSIS:
6         Encap package management involves putting programs in an encap directory
7 and then the epkg program symlinks each package into say, /usr. This is very 
8 convenient for LFS users since it involves building no actual packages
9 (.rpm/.deb) but provides version management.
11 HINT:
13 LFS is great for completely customising a system, but once it's been compiled, 
14 that's it. Uninstalling programs by doing "make uninstall" and the like is not 
15 practical -- sometimes not even possible. Doing something like this with RPM or 
16 dpkg would be possible but probably very difficult and using install-log lets 
17 you keep track of files, but not really manage them. That's were encap comes in.
19 Encap is a package management system based on symlinks. Packages exist in an 
20 encap source directory (usually /usr/encap) and then the epkg program symlinks 
21 /usr/encap/package-version/* to /usr/*. Since packages are packagename-version, 
22 multiple versions can be installed and switched without a problems -- great for 
23 testing new versions.
25 How to Insane are You?
26 ----------------------
28 Here's the problem, how fanatical are you? I admit to being very fanatical. epkg 
29 manages *all* of the packages on my system except glibc and epkg. Everything 
30 else, even gcc and all of the basic LFS packages are controlled by epkg. That 
31 may be more than you want controlled. epkg can control just your /usr/local
32 programs. I think your decision for deciding whether or not to install a package 
33 as an encap package should be based on "am I ever going to upgrade this?" Glibc 
34 is never going to be upgraded without a complete system recompile, so that 
35 should not be epkged. Also there is a certain impracticality in installing epkg 
36 as an epkg. I'm going to assume you are completely insane and want to install 
37 everything as an encap package. Start when ever you want.
39 Starting
40 --------
42 To start, where do you want to install the packages?
43 I personally, have one big partition, so I installed my packages for / in 
44 /Software/Root, my packages for /usr in /Software/User, my packages for 
45 /usr/local in /Software/Local and for /opt/kde in /Software/KDE. If you want to 
46 keep things (eg /usr) on a separate partition, you could mount /usr and have the 
47 packages in /usr/Software or /usr/encap or your could keep /usr/* on your root 
48 partition since it's almost all symlinks and mount /Software/User. Point is, 
49 make package directories now. Depending on what you have installed, I recommend 
50 making a directory for /, /usr, /usr/local, /usr/X11R6, /opt/kde or /usr/kde and
51 /opt/gnome or /usr/gnome.
53 Encap trees *can* overlap, but epkg will issue meaningless warnings. Overlapping 
54 is not a problem. This is useful later.
56 Get epkg from http://www.encap.org/epkg/ Right after compiling glibc, compile
57 epkg like so:
59 ./configure --disable-encap --with-encap-source=/Software/User \
60 --with-encap-target=/usr
61 make
63 Note the lack of trailing slashes. If you want the user packages from elsewhere
64 use /usr/encap or whatever.
65 Now *don't make install*. Copy epkg/epkg to /usr/bin/epkg-usr and
66 mkencap/mkencap to /usr/bin/mkencap-usr
68 Now repeat this for each tree you want like:
69 --with-encap-source=/Software/local --with-encap-target=/usr/local
70 --with-encap-source=/Software/KDE --with-encap-target=/opt/kde
72 but copy epkg/epkg to epkg-local or epkg-kde and mkencap/mkencap to 
73 mkencap-local or mkencap-kde.
74 Also,
75 cp doc/*.1 /usr/share/man/man1
76 cp doc/*.3 /usr/share/man/man3
77 cp doc/*.7 /usr/share/man/man7
79 If you are managing root (/) then
80 ./configure --disable-encap --with-encap-source=/Software/Root \
81 --with-encap-target="" \
82 --with-excludes=src:lost+found:opt:dev:proc:tmp:home:Software
83 make
84 cp epkg/epkg /usr/bin/epkg-root
85 cp mkencap/mkencap /usr/bin/mkencap-root
87 The excludes are important. We don't want epkg wandering into dev, proc, tmp, 
88 home or Software. If your package directory is elsewhere, then change the name
89 appropriately. You may want it to wander into opt. None of my root packages 
90 touch things in opt and this speeds things up since it won't take so long.
91 Now you have everthing need to make packages!
93 Building programs
94 -----------------
96 Programs are stupid. Some more than others. For most standard, pleasant
97 programs, do something like:
98 ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc
99 make
100 make install prefix=/Software/User/package-1.0
101 epkg-usr package
103 But not all programs are like that. *Most* FSF, KDE and GNOME programs are like 
104 that. Many others are not. Some user "make install
105 PREFIX=/Software/User/package-1.0" or possibly "make install
106 DESTDIR=/Software/User/package-1.0". But some use just DEST, or INSTDIR, or
107 BASEDIR and some have each path hardcoded like BINDIR=/usr/bin, MANDIR=/usr/man. 
108 The best way is to run the configure process, then look at the Makefile and hope 
109 you can figure out what to change.
111 If also, "make" the package before specifying any kind of /Software/User prefix.
113 One very pleasantly notable exception is perl. Rather than 
114 running./configure.gnu,
115 run ./Configure. It will ask you where perl will be, say /usr, and where the
116 perl files will reside, say /Software/User/perl-5.xx. The just "make && make 
117 make check && make install".
119 Not the sysconfdir and localstatedir. These are optional, but if they are not
120 there, then the package will put its config files in /usr/etc, /usr/lib or other
121 strange places. Some, like samba, you may even want to say,
122 --sysconfdir=/etc/samba.
124 Some progams will not create subdirectories if they don't exists, meaning you 
125 have to manually use mkdir to create the directories and it may do lovely things 
126 like cp libxyz.so /Software/xyz-1.0/lib . If lib doesn't exist, you now have a 
127 file called lib, rather than lib/libxyz.so.
129 Also, before running epkg to install the package, check out the package
130 directory. Many programs will put man pages in /usr/man rather than
131 /usr/share/man. Same with info files. You can adjust all of that before you
132 install the package. Also, delete any info/dir or share/info/dir files if they
133 exist.
135 *DO NOT INSTALL XFREE86 AS A PACKAGE*
136 It's too messy, just put it in /usr/X11R6 and any additional X programs can be
137 installed as packages and integrated into the /usr/X11R6 tree. Then, if you
138 upgrade, blast away /usr/X11R6, reinstall X11 and then epkg-x11 -b and all of
139 your X11 packages will be restored.
141 Root Programs
142 -------------
144 Some programs like: bash, bzip2, e2fsprogs, fileutils, grep, gzip, kbd, less,
145 man, modutils, net-tools, pam, pcmcia-cs, ppp, procps, psmisc, sed, sh-utils,
146 shadow, sysvinit, tar, textutils and util-linux
147 need to be on the root directory, but have man pages or other programs that
148 should be in /usr. Encap trees can overlap!
149 So install bash like this:
150 ./configure --prefix=/usr --bindir=/bin &&
151 make &&
152 make install prefix=/Software/Root/bash-2.05a/usr \
153 bindir=/Software/Root/bash-2.05a/bin
155 There are other programs that have a prefix=/usr and something else, usually
156 execprefix=/
157 When you epkg-root bash, it will install bash in /bin and the manpages in /usr.
159 Keeping Things Clean
160 --------------------
162 I suggest making a cleansystem script that does something like this:
164 #!/bin/sh -
166 cd /
167 epkg-root $@ -s /Software/Root/ -t .. -c | grep -v "not an Encap link"
168 epkg-root $@ -b | grep -v "not an Encap link"
170 for EPKG in /usr/bin/epkg-*
172         if [ $EPKG != /usr/bin/epkg-root ]
173         then
174                 $EPKG $@ -c | grep -v "not an Encap link"
175                 $EPKG $@ -b | grep -v "not an Encap link"
176         fi
177 done
179 echo "Regenerating Info Cache..."
180 rm /usr/share/info/dir
181 for INFO in /usr/share/info/*.info
183         install-info $INFO /usr/share/info/dir
184 done
186 cd $PWD
187 #EOF
189 Running the cleansystem -n will pretend to clean the system and -v will provide 
190 verbose output. It will regenerate the info directory regardless.
192 Note that epkg-XXX will complaing about every symlink that it finds that does
193 not point to /Software/XXX. That's annoying, especially for the files that
194 overlap from the root directory. The grep prevents us from hearing its whining.
196 If you epkg-root -c, it will not find any encap related files, even though they 
197 exist. This is because it tries to open directory "" which fails. The directory
198 for -s *should* have a trailing /.
200 Epkg will also alert your to any conflicting files. On the freshest LFS install
201 you will find that /usr/lib/libiberty.a and /usr/bin/c++filt conflict between
202 gcc and binutils. Which one do you keep? I dunno. If this were a normal LFS
203 system, binutils is made after gcc, so it should be there. Other things tend to
204 get installed multiple times. Many packages seem to install the pidof.1 manpage.
205 Pick the one you like best and remove the rest.
208 The Pain that is KDE
209 --------------------
211 I link KDE, but it is a pain. Some things will not work properly if you use the 
212 encap symlinking. Anything in $KDE/share/templates that is a symlink won't 
213 work properly. For instance if you have a kword symlink in there and go 
214 New | Text Document, it will copy the symlink to the root-owned file rather than 
215 copy a blank kword document. Just "mv /Software/KDE/*/share/templates/*
216 /opt/kde/share/templates". Also the Konqueror side bar can break, due again to
217 symlink copying. Either "mv /Software/KDE/*/share/apps/konqsidebartng/* 
218 /opt/kde/share/apps/konqsidebartng" or you can mess around in
219 ~/.kde/share/apps/konqsidebar. I have no doubt that there are other broken KDE
220 parts I have forgotten or not discovered. The advantage is that this provides a
221 *really* easy way to switch KDE versions.
223 I also recommend you create a /Software/KDE/hostname directory. This allows you
224 to put things that are not going to change from KDE version to version that are
225 specific to your system -- global wallpapers, applnks for programs and other
226 stuff like that. Just "epkg-kde hostname" and all that stuff is accessible.
231 Why ./configure --prefix=/usr, why not ./configure
232 --prefix=/Software/User/package-1.0 like the encap documentation says?
234 That may work for some programs, but gcc and many libraries will not. You see,
235 some libraries make a lib-config file (gtk, pcre, cups, glib, libpng) to tell
236 programs building against it where its prefix is. If you do it the 
237 /Software/User way, then anything built against that library will point to
238 /Software/User rather than /usr making it more difficult to upgrade the library.
239 And we did this for upgradeability, right?
241 Some programs need special attention, right?
242 Yes: tcl/tk/tclx, iptables, QT <3 (3+ is fine), ppp and f#!/ing man
243 Be highly suspicious of anything that does not come with a configure script.
244 Also don't bother installing anything living in /lib/modules (ie
245 alsa-drivers) as a package (alsa-lib and alsa-utils can be nicely packaged)
247 I accidentally installed xyz into /usr. Can I fix it easily?
248 Yes, install it to /Software/User/xyz-1.0 and attempt to epkg xyz. That will
249 complain that it cannot replace the non-encap symlinks. Delete the files from
250 the /usr tree and then epkg xyz.
252 Program abc installed its man pages directly in /usr/man or /usr/share man. Is
253 there any easy way to fix that?
254 Not really, you can pick them out by hand, or pull them out of the program's
255 build directory. If this is an LFS, or BLFS package, maybe it should be added to
256 the list of stupid programs.
258 Are all of your packages really installed as encap packages?
259 No, glibc, XFree86, epkg, j2sdk and teTeX are not. Glibc isn't going to be
260 upgraded, epkg is impractical to have as an encap package. X11 is a mess that
261 best to just leave alone. Java and teTeX live in /opt/j2sdk and /opt/teTeX so
262 there's no point in having packages.
264 sh should be symlinked to bash, should that go in /Software/Root/bash-2.05a/bin
265 or /bin?
266 Depends. I say, if sh is always -> and it's in the same package, do it in the
267 /Software tree. Same with cc -> gcc. If sh might point to bash or csh or ksh
268 then do it in /bin. Whatever makes you happier.