[c5c522c] | 1 | ############################################################################## |
---|
| 2 | # Document: OVERVIEW |
---|
| 3 | # Purpose : Provide an overview of the Slackware package system incorporating |
---|
| 4 | # the use of 'slacktrack' |
---|
| 5 | # Please note that this is *not* a guide to the use of slacktrack; |
---|
| 6 | # the man page and SlackBuild scripts in the 'examples' directory |
---|
| 7 | # aim to fulfill that requirement. |
---|
| 8 | # Date....: 15-May-2009 |
---|
| 9 | # Author..: Stuart Winter <mozes@slackware.com> |
---|
| 10 | # Homepage: http://www.slackware.com/~mozes |
---|
| 11 | ############################################################################## |
---|
| 12 | |
---|
| 13 | |
---|
| 14 | CONTENTS: |
---|
| 15 | --------- |
---|
| 16 | 1.0 Preamble |
---|
| 17 | 2.0 Slackware packages |
---|
| 18 | 2.0.1 Format of official Slackware packages |
---|
| 19 | 2.0.1.1 Package names |
---|
| 20 | 2.0.1.2 Version numbers |
---|
| 21 | 2.0.1.3 Architectures |
---|
| 22 | 2.0.1.4 Build numbers |
---|
| 23 | 2.1 An overview of the creation of official Slackware packages |
---|
| 24 | 2.1.1 'Clean' and 'dirty' builds |
---|
| 25 | 2.1.1.1 Clean builds |
---|
| 26 | 2.1.1.2 Dirty builds |
---|
| 27 | 2.1.1 SlackBuild and .build scripts |
---|
| 28 | 2.1.1.2 SlackBuild scripts |
---|
| 29 | 2.1.1.3 .build scripts |
---|
| 30 | 2.2 slacktrack in the scheme of things |
---|
| 31 | 2.2.1 Using slacktrack with official .build scripts |
---|
| 32 | 2.2.2 Writing your own .build scripts for slacktrack |
---|
| 33 | 2.2.2.1 Making use of slacktrack's environment variables |
---|
| 34 | 3.0 slacktrack in operation |
---|
| 35 | 3.1 How slacktrack finds which files have been installed |
---|
| 36 | 3.1.1 installwatch's author |
---|
| 37 | 4.0 Example scripts |
---|
| 38 | 4.0.1 non-slackware example build scripts |
---|
| 39 | 4.0.2 slackware example wrapper build scripts |
---|
| 40 | 5.0 Known problems/features of slacktrack |
---|
| 41 | 6.0 New features |
---|
| 42 | 7.0 Licence |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | |
---|
| 46 | 1.0 Preamble |
---|
| 47 | --------- |
---|
| 48 | |
---|
| 49 | I used to work for a company that provided web hosting and shell accounts. |
---|
| 50 | When I started there were a number of shell servers all running various |
---|
| 51 | releases of RedHat Linux, in various states of repair. I managed to convince |
---|
| 52 | the management to let me try Slackware on there instead because I have a much |
---|
| 53 | stronger understanding of how to maintain and build server using the |
---|
| 54 | Slackware distribution. This trial went well and within a few months all |
---|
| 55 | servers were converted to Slackware version 8.1. |
---|
| 56 | |
---|
| 57 | In order to ease the speed of installation (and to prevent against |
---|
| 58 | forgetting to install or configure something critical), I wrote a |
---|
| 59 | set of post installation scripts that upgraded Slackware packages, |
---|
| 60 | configured numerous config files and copied pre-compiled software |
---|
| 61 | (such as courier IMAP) onto the new system. |
---|
| 62 | For other software that I could not simply copy, I'd compile it on the |
---|
| 63 | new server. |
---|
| 64 | |
---|
| 65 | However, it soon became clear that due to security updates and so on, |
---|
| 66 | it became incredibly time consuming (not to mention seriously boring) |
---|
| 67 | to compile PHP, Apache and so on on every server. |
---|
| 68 | |
---|
| 69 | At this point, I began to investigate how to create packages for Slackware. |
---|
| 70 | |
---|
| 71 | |
---|
| 72 | 2.0 Slackware packages |
---|
| 73 | ------------------ |
---|
| 74 | |
---|
| 75 | The Slackware Linux distribution consists of a variety of 'packages' |
---|
| 76 | that make up the distribution. |
---|
| 77 | |
---|
| 78 | Traditionally, all packages are in '.tgz' format (a gzipped tar archive). |
---|
| 79 | Starting with Slackware v13, new compression formats are supported which |
---|
| 80 | are represented by three additional file extensions: |
---|
| 81 | |
---|
| 82 | .tgz - Gzip |
---|
| 83 | .tbz - Bzip2 |
---|
| 84 | .tlz - LZMA |
---|
| 85 | .txz - XZ |
---|
| 86 | |
---|
| 87 | In this document, we use the file extension '.t?z' to represent |
---|
| 88 | one of the above file formats. |
---|
| 89 | |
---|
| 90 | Once you have initially installed Slackware from the installer screen, |
---|
| 91 | you have the facilities to install, remove or upgrade new or existing |
---|
| 92 | packages using the package management tools: |
---|
| 93 | |
---|
| 94 | installpkg <package.t?z> - install 'package.t?z' |
---|
| 95 | |
---|
| 96 | upgradepkg <package.t?z> - upgrade existing 'package' with the |
---|
| 97 | new version specified at the command line. |
---|
| 98 | |
---|
| 99 | removepkg <package> - remove specified package |
---|
| 100 | |
---|
| 101 | |
---|
| 102 | Whilst the Slackware package system is not especially feature rich, |
---|
| 103 | Slackware's user base (including me) like it because it is simple. |
---|
| 104 | If we want to write our own package utilities then we can easily do so |
---|
| 105 | by examining the existing package tools and querying and amending the |
---|
| 106 | package database (text files). |
---|
| 107 | |
---|
| 108 | 2.0.1 Format of official Slackware packages |
---|
| 109 | ------------------------------------- |
---|
| 110 | |
---|
| 111 | In Slackware 8.1 and up, each package file is named as follows: |
---|
| 112 | |
---|
| 113 | packagename-version-architecture-buildnumber.t?z |
---|
| 114 | |
---|
| 115 | 2.0.1.1 Package names |
---|
| 116 | ------------- |
---|
| 117 | |
---|
| 118 | The package name is either the name of the single program |
---|
| 119 | or the name of a collection of utilities that fall under |
---|
| 120 | a single umbrella. |
---|
| 121 | For example: |
---|
| 122 | autoconf-2.54-noarch-1.tgz |
---|
| 123 | |
---|
| 124 | That is the name of the autoconf package I have on my |
---|
| 125 | Slackware 8.1 box. |
---|
| 126 | 'autoconf' is the name of the the entire collection of |
---|
| 127 | binaries and associated documents that are extracted from |
---|
| 128 | the autoconf source distribution archive. |
---|
| 129 | |
---|
| 130 | However, if we consider another example: |
---|
| 131 | tcpip-0.17-i386-15.tgz |
---|
| 132 | |
---|
| 133 | There is no single piece of software called 'tcpip'. |
---|
| 134 | This package contains a number of associated utilities |
---|
| 135 | written by different authors but bundled into one single |
---|
| 136 | 'package'. |
---|
| 137 | |
---|
| 138 | 2.0.1.2 Version numbers |
---|
| 139 | --------------- |
---|
| 140 | |
---|
| 141 | If the package is the name of a particular piece of software |
---|
| 142 | such as 'autoconf' from the example above, then the version |
---|
| 143 | number represents the version number that its authors distribute. |
---|
| 144 | |
---|
| 145 | If the package is a 'bundle' such as 'tcpip' then the version |
---|
| 146 | number increases as and when you add a new piece of software to |
---|
| 147 | the package, or upgrade a particular piece of major software |
---|
| 148 | contained within the package. |
---|
| 149 | For example, with 'tcpip' above, the 0.17 refers to the version of |
---|
| 150 | Linux Netkit. However, there are other programs included within |
---|
| 151 | the Slackware tcpip package that are not part of 'Linux netkit'. |
---|
| 152 | |
---|
| 153 | 2.0.1.3 Architectures |
---|
| 154 | ------------- |
---|
| 155 | |
---|
| 156 | The architecture is just that -- it tells you which architecture |
---|
| 157 | the package is for. |
---|
| 158 | |
---|
| 159 | The current values in use are: |
---|
| 160 | |
---|
| 161 | ----- [ Official Slackware architecures ] |
---|
| 162 | |
---|
| 163 | noarch - Architecture independent files such as config files |
---|
| 164 | i386 - packages for the x86 (Slackware v8.1 & 9) |
---|
| 165 | i486 - packages for the x86 (Slackware 9.1+) |
---|
| 166 | i586 - packages for the x86 |
---|
| 167 | s390 - packages for the IBM s/390 mainframe |
---|
| 168 | |
---|
| 169 | Note: Whilst Slackware v10 is primarily built for i486, you may |
---|
| 170 | find that there are some packages whose architecture versions |
---|
| 171 | are higher than i486. This is for two reasons: |
---|
| 172 | |
---|
| 173 | [a] There is no source for the package - it is a repackaged |
---|
| 174 | binary distribution (SUN's j2sdk is an example). |
---|
| 175 | |
---|
| 176 | [b] The package is not required or otherwise not suitable for |
---|
| 177 | earlier revisions of the architecture (this is especially |
---|
| 178 | the true with ARM and SPARC). |
---|
| 179 | |
---|
| 180 | ----- [ Unofficial ports of Slackware ] |
---|
| 181 | |
---|
| 182 | arm - packages for the ARM architecture |
---|
| 183 | sparc - packages for the SUN Sparc architecture |
---|
| 184 | powerpc - packages for the PowerPC architecture |
---|
| 185 | |
---|
| 186 | 2.0.1.4 Build numbers |
---|
| 187 | ------------- |
---|
| 188 | |
---|
| 189 | A build number suplements the version number and is changed |
---|
| 190 | when the *package maintainer* makes a change to the package but |
---|
| 191 | the original source code and version number remains the same. |
---|
| 192 | |
---|
| 193 | For example, I build a package of 'foo' version 0.14 for the |
---|
| 194 | sparc. I have never built this package before, thus it becomes |
---|
| 195 | foo-0.14-sparc-1.tgz |
---|
| 196 | However, I realise that I haven't configured |
---|
| 197 | the 'bar' parameter correctly in /etc/foo.conf. I fix it |
---|
| 198 | and re-build the package. The package is now named |
---|
| 199 | foo-0.14-sparc-2.tgz |
---|
| 200 | |
---|
| 201 | |
---|
| 202 | 2.1 An overview of the creation of official Slackware packages |
---|
| 203 | ----------------------------------------------------------- |
---|
| 204 | |
---|
| 205 | This section gives a brief introduction of the two methods of |
---|
| 206 | used when building the official Slackware packages. |
---|
| 207 | |
---|
| 208 | |
---|
| 209 | 2.1.1 'Clean' and 'dirty' builds |
---|
| 210 | -------------------------- |
---|
| 211 | |
---|
| 212 | I am assuming the reader has some experience with Makefiles |
---|
| 213 | and has compiled and installed a number of software packages. |
---|
| 214 | |
---|
| 215 | 2.1.1.1 Clean builds |
---|
| 216 | ------------ |
---|
| 217 | |
---|
| 218 | I term a 'clean' package one where you can specify a variable |
---|
| 219 | to the 'make install' which contains the directory you wish to install |
---|
| 220 | the package in, rather than installing it properly over the root file system. |
---|
| 221 | For example: |
---|
| 222 | # ./configure --prefix=/usr --sysconfdir=/etc |
---|
| 223 | # make |
---|
| 224 | # make install DESTDIR=/tmp/package-foo |
---|
| 225 | |
---|
| 226 | With a 'Makefile' that honours the DESTDIR variable, this will |
---|
| 227 | install the whole package into /tmp/package-foo. This directory |
---|
| 228 | effectively is the 'root' directory '/' as far as the Makefile |
---|
| 229 | is concerned. |
---|
| 230 | |
---|
| 231 | From here you can use the Slackware 'makepkg' program and build |
---|
| 232 | a package. |
---|
| 233 | |
---|
| 234 | This is by far the safest and most preferred method by all |
---|
| 235 | users that make packages. |
---|
| 236 | |
---|
| 237 | You will find that DESTDIR is called prefix, TOPDIR and other names; |
---|
| 238 | you need to examine the Makefile scripts in order to determine whether |
---|
| 239 | it contains this functionality and if it does, then discover what |
---|
| 240 | the variable name is. |
---|
| 241 | |
---|
| 242 | 2.1.1.2 Dirty builds |
---|
| 243 | ------------ |
---|
| 244 | |
---|
| 245 | A 'dirty' build is the name I give to source distribution archives |
---|
| 246 | whose Makefile scripts do not have any provisioning to install |
---|
| 247 | in an alternate directory other than root. |
---|
| 248 | |
---|
| 249 | For these type of builds, you will typically do: |
---|
| 250 | # ./configure --prefix=/usr --sysconfdir=/etc |
---|
| 251 | # make |
---|
| 252 | # make install |
---|
| 253 | |
---|
| 254 | The package will then be installed on the root filesystem. |
---|
| 255 | |
---|
| 256 | So how do you know what files were installed where and |
---|
| 257 | even if you did, how do you pull all these files together in order |
---|
| 258 | to run makepkg over them ? |
---|
| 259 | That's the purpose of slacktrack! :-) |
---|
| 260 | |
---|
| 261 | |
---|
| 262 | 2.1.1 SlackBuild and .build scripts |
---|
| 263 | ----------------------------- |
---|
| 264 | |
---|
| 265 | Slackware has a number of packages by a great number of authors. |
---|
| 266 | Some of the packages's source Makefiles honour a DESTDIR type |
---|
| 267 | variable but others do not. |
---|
| 268 | |
---|
| 269 | 2.1.1.2 SlackBuild scripts |
---|
| 270 | ------------------ |
---|
| 271 | |
---|
| 272 | SlackBuild scripts can be 'interesting'. They are |
---|
| 273 | scripts that install into a 'clean' environment (usually /tmp). |
---|
| 274 | |
---|
| 275 | Some of the scripts follow the make install DESTDIR= |
---|
| 276 | style, if the Makefile permits. |
---|
| 277 | |
---|
| 278 | Others have a 'framework' or 'controller tarball' which is |
---|
| 279 | a _packagename.t?z (note the prefixing underscore). |
---|
| 280 | |
---|
| 281 | The SlackBuild script uses the Slackware 'explodepkg' script |
---|
| 282 | to untar the contents of the _.t?z into the /tmp-package<name> |
---|
| 283 | directory. |
---|
| 284 | Slackbuild then runs 'make' to compile the binaries |
---|
| 285 | and libraries, but then uses the 'cat' program such as: |
---|
| 286 | # cat foobar > /tmp/package-foobar/usr/bin/foobar |
---|
| 287 | |
---|
| 288 | By using 'cat', the *new* version of 'foobar' retains |
---|
| 289 | the original permissions and ownerships that are in the |
---|
| 290 | controller tar ball. |
---|
| 291 | |
---|
| 292 | However, you may be wondering how, if the package does not |
---|
| 293 | have a facility to install into somewhere other than root, |
---|
| 294 | do we get the file names and permissions for the |
---|
| 295 | controller _.t?z in the first place. |
---|
| 296 | The answer is simple: |
---|
| 297 | [a] find all files on the file system and dump to a file. |
---|
| 298 | [b] compile and install the software |
---|
| 299 | [c] find all files on the file system and compare the file |
---|
| 300 | produced by the first 'find'. After a little pruning, you |
---|
| 301 | have the list of files for the controller tar ball. |
---|
| 302 | |
---|
| 303 | |
---|
| 304 | 2.1.1.3 .build scripts |
---|
| 305 | --------------- |
---|
| 306 | |
---|
| 307 | For those software distributions whose Makefile does not hounour |
---|
| 308 | the DESTDIR type system, there are Slackware's .build scripts. |
---|
| 309 | |
---|
| 310 | These scripts literally ./configure ; make ; make install |
---|
| 311 | and copy docs and other goodies into the root file system. |
---|
| 312 | |
---|
| 313 | One of the problems with these scripts is that they are |
---|
| 314 | often incomplete -- they build and install the package but |
---|
| 315 | do not gzip the man pages or strip the binaries and libraries; |
---|
| 316 | this is done manually afterwards. |
---|
| 317 | |
---|
| 318 | *These* are the scripts that slacktrack and altertrack were |
---|
| 319 | written for. |
---|
| 320 | |
---|
| 321 | * Note: Whilst some software's Makefiles may appear to honour |
---|
| 322 | the DESTDIR variable, the Makefile *may* be broken which can |
---|
| 323 | result in files missing or corrupt within your new package. |
---|
| 324 | For example: I built Apache v2.0.48 and built a package using |
---|
| 325 | make install DESTDIR. However, a problem exists in that some of |
---|
| 326 | the Perl scripts it installs have *temporary build paths* |
---|
| 327 | hard coded into the resulting scripts. |
---|
| 328 | This is why you *may* find a .build instead of a SlackBuild |
---|
| 329 | script within Slackware's source tree. |
---|
| 330 | |
---|
| 331 | However, the primary reason is because the build script just |
---|
| 332 | hasn't been updated to make use of DESTDIR. * |
---|
| 333 | |
---|
| 334 | |
---|
| 335 | 2.2 slacktrack in the scheme of things |
---|
| 336 | ---------------------------------- |
---|
| 337 | |
---|
| 338 | I follow Slackware-current quite closly. Often I want to |
---|
| 339 | 'back port' a -current package to an earlier release of Slackware . |
---|
| 340 | I can't simply upgrade with -current's package because it was |
---|
| 341 | compiled for a newer GLIBC than Slackware 8.1's, for example. |
---|
| 342 | For packages that use a 'clean' 'SlackBuild' script, this is |
---|
| 343 | an easy job -- I simply run 'SlackBuild' on an 8.1 box. |
---|
| 344 | |
---|
| 345 | However, for .build scripts, I needed a way of building packages |
---|
| 346 | using Slackware's .build scripts. |
---|
| 347 | |
---|
| 348 | I found a great program called 'CheckInstall' which fulfilled most of my |
---|
| 349 | requirements. However, as time went on and I started building |
---|
| 350 | more of Slackware's packages and writing my own build scripts, I found |
---|
| 351 | that checkinstall was lacking some features that I required. |
---|
| 352 | At this time I was also considering porting Slackware to run on |
---|
| 353 | the ARM architecture and helping with the Splack (Slackware on SPARC project), |
---|
| 354 | and therefore wanted a robust program that can deal with every .build script |
---|
| 355 | I threw at it, and if it can't handle it, I needed to be able to make modifications. |
---|
| 356 | The easiest way of doing this was to write my own script; thus |
---|
| 357 | 'slacktrack' was born. |
---|
| 358 | |
---|
| 359 | slacktrack is based on the *idea* behind 'CheckInstall', but uses |
---|
| 360 | only my own code (and contributions from other users), and only contains |
---|
| 361 | Slackware-specific facilities -- it can not build Debian or RedHat packages |
---|
| 362 | and never will. |
---|
| 363 | |
---|
| 364 | slacktrack does not have all of the facilities of CheckInstall either, |
---|
| 365 | but then these are not required for building Slackware packages |
---|
| 366 | from .build scripts. |
---|
| 367 | |
---|
| 368 | Also, slacktrack only works with 'official' Slackware directory locations |
---|
| 369 | and /usr/local. |
---|
| 370 | For example, if your make install installs binaries in /opt/packagename/bin |
---|
| 371 | and the man pages in anywhere other than /usr/man or /usr/local/man, then |
---|
| 372 | slacktrack's relevant options (eg stripping libs, bins, gzman) will |
---|
| 373 | not detect them. |
---|
| 374 | |
---|
| 375 | |
---|
| 376 | 2.2.1 Using slacktrack with official .build scripts |
---|
| 377 | --------------------------------------------- |
---|
| 378 | |
---|
| 379 | Building a replicar Slackware package from a .build script is |
---|
| 380 | typically fairly trivial with slacktrack. |
---|
| 381 | |
---|
| 382 | If we wanted to build slackware-9.1's elvis, we could do |
---|
| 383 | # cd slackware/slackware-9.1/source/a/elvis |
---|
| 384 | # chmod 755 elvis.build |
---|
| 385 | # slacktrack -jefkzp "elvis-2.1-i386-2.tgz" ./elvis.build |
---|
| 386 | |
---|
| 387 | The resulting package (by default) be stored in |
---|
| 388 | /tmp/built-slackwarepackages/ |
---|
| 389 | |
---|
| 390 | As already mentioned, some of the Slackware .build scripts |
---|
| 391 | are incomplete with regard to gzipping man pages, stripping binaries |
---|
| 392 | and so on -- fetchmail.build is one of them. |
---|
| 393 | Therefore you can specify various options to slacktrack that |
---|
| 394 | will take care of this for you. |
---|
| 395 | The options in the example above : |
---|
| 396 | j - compress libraries |
---|
| 397 | e - chown root:bin /bin,/sbin,/usr/bin,/usr/sbin directories |
---|
| 398 | f - chown root:bin files in the binary dirs listed above |
---|
| 399 | k - strip binaries found in the binary dirs listed above |
---|
| 400 | z - gzip man pages |
---|
| 401 | p - the resulting Slackware package .t?z name |
---|
| 402 | |
---|
| 403 | The way I re-create the packages is to build a 'trackbuild' script that |
---|
| 404 | launches slacktrack with the required options and the name |
---|
| 405 | of the Slackware .build script. You can find examples of such |
---|
| 406 | scripts within the docs directory after installing slacktrack: |
---|
| 407 | |
---|
| 408 | /usr/doc/slacktrack*/buildscript-examples/ |
---|
| 409 | |
---|
| 410 | You will also find that in Slackware versions 12.0 and upwards, |
---|
| 411 | the .build scripts are accompanied by 'trackbuild' scripts because |
---|
| 412 | slacktrack is used by the Slackware team to produce the packages. |
---|
| 413 | |
---|
| 414 | 2.2.2 Writing your own .build scripts for slacktrack |
---|
| 415 | ---------------------------------------------- |
---|
| 416 | |
---|
| 417 | There isn't any specific that you have to do to write a build |
---|
| 418 | script for use with slacktrack -- the script name specified to |
---|
| 419 | slacktrack doesn't even have to be a script - it can be a binary - |
---|
| 420 | as long as it is executable, it is acceptable. |
---|
| 421 | |
---|
| 422 | You can see some of my own build scripts that I have written |
---|
| 423 | for use with slacktrack by looking in the documents directory |
---|
| 424 | after installing slacktrack: |
---|
| 425 | |
---|
| 426 | /usr/doc/slacktrack*/buildscript-examples/ |
---|
| 427 | |
---|
| 428 | 2.2.2.1 Making use of slacktrack's environment variables |
---|
| 429 | ------------------------------------------------- |
---|
| 430 | |
---|
| 431 | slacktrack exports two environment variables: |
---|
| 432 | SLACKTRACKFAKEROOT and SLACKTRACKSCRATCHDIR |
---|
| 433 | |
---|
| 434 | SLACKTRACKFAKEROOT: |
---|
| 435 | ```````````````````` |
---|
| 436 | |
---|
| 437 | The purpose of this to allow your .build script to access the |
---|
| 438 | 'root' directory of the resulting package. |
---|
| 439 | There are two scenarios where you may want to use this |
---|
| 440 | variable: |
---|
| 441 | |
---|
| 442 | 1. During the build: |
---|
| 443 | |
---|
| 444 | The reason you may wish to do this is to pre-populate |
---|
| 445 | the package with files that you may not wish to place directly |
---|
| 446 | onto the root filesystem. |
---|
| 447 | The package contents will only appear inside this directory |
---|
| 448 | once your build script has finished, and slacktrack has determined |
---|
| 449 | what to put into this directory. |
---|
| 450 | |
---|
| 451 | In previous slacktrack versions which used a pseudo-root filesystem |
---|
| 452 | (where the package contents were populated *during* the build), this |
---|
| 453 | made sense, but in slacktrack v2.00, it is unlikely that you'd want |
---|
| 454 | to use this vairable from the build script. |
---|
| 455 | |
---|
| 456 | 2. Post-build -- cleanups after the build: |
---|
| 457 | |
---|
| 458 | The most likely use of this script is to perform package cleanup |
---|
| 459 | tasks after the build. This is mainly to perform tasks that slacktrack |
---|
| 460 | does not handle itself - such as deleting known files/directories that |
---|
| 461 | creep into packages (due to a system daemon such as CUPS), or setting |
---|
| 462 | some file and directory permissions. |
---|
| 463 | |
---|
| 464 | An example post build script is below. |
---|
| 465 | A post build script can be specified by slacktrack's -R option: |
---|
| 466 | |
---|
| 467 | # Incase you had CUPS running: |
---|
| 468 | rm -rf etc/cups etc/printcap |
---|
| 469 | # crond: |
---|
| 470 | rm -rf var/spool/cron |
---|
| 471 | rmdir var/spool |
---|
| 472 | |
---|
| 473 | # perllocal.pod files don't belong in packages. |
---|
| 474 | # SGMLSPL creates this: |
---|
| 475 | find . -name perllocal.pod -print0 | xargs -0 rm -f |
---|
| 476 | |
---|
| 477 | # Some doc dirs have attracted setuid. |
---|
| 478 | # We don't need setuid for anything in this package: |
---|
| 479 | chmod -R a-s . |
---|
| 480 | |
---|
| 481 | |
---|
| 482 | SLACKTRACKSCRATCHDIR: |
---|
| 483 | ````````````````````` |
---|
| 484 | |
---|
| 485 | The purpose of this variable is to provide some temporary |
---|
| 486 | space to untar your source archives and so on. slacktrack |
---|
| 487 | will manage the creation and deletion of this directory. |
---|
| 488 | |
---|
| 489 | For example: |
---|
| 490 | # cd ${SLACKTRACKSCRATCHDIR} |
---|
| 491 | # tar zxvvf ${ORIGPATH}/source/foobar.tar.gz |
---|
| 492 | |
---|
| 493 | You can see in some of the example 'non-slackware' scripts |
---|
| 494 | how I have used these variables |
---|
| 495 | |
---|
| 496 | |
---|
| 497 | 3.0 slacktrack in operation |
---|
| 498 | ----------------------- |
---|
| 499 | |
---|
| 500 | The basic event flow is as follows: |
---|
| 501 | |
---|
| 502 | [1] Parse command line arguments |
---|
| 503 | -> Check they are OK, if not bomb out |
---|
| 504 | [2] Launch the supplied build script |
---|
| 505 | [3] Run any specified functions (eg gzman, strip bins, chowns) over the |
---|
| 506 | package 'root' directory and contents |
---|
| 507 | [4] Run Slackware's 'makepkg' program over the package contents |
---|
| 508 | [5] Move the .t?z to the specified build store path |
---|
| 509 | [6] Scan for any hard links that may be in the package |
---|
| 510 | -> If any found, alert the user on screen and also |
---|
| 511 | log to a packagename.hardlinks.log file in the build store path |
---|
| 512 | |
---|
| 513 | The slacktrack shell script is fairly simple and well commented; it should be |
---|
| 514 | relatively easy for anybody who understands bash to quickly comprehend what |
---|
| 515 | is happening and why. |
---|
| 516 | |
---|
| 517 | 3.1 How slacktrack finds which files have been installed |
---|
| 518 | ---------------------------------------------------- |
---|
| 519 | |
---|
| 520 | In order to track the files and directories that have been installed |
---|
| 521 | or changed, slacktrack follows this ordered process: |
---|
| 522 | |
---|
| 523 | [1] Scans a pre-set list of directories on the filesystem and |
---|
| 524 | logs the contents. |
---|
| 525 | [2] Launches build script which installs the package onto the |
---|
| 526 | filesystem |
---|
| 527 | [3] Scans the filesystem once again |
---|
| 528 | [4] Compares the differences in the before and after snapshots |
---|
| 529 | [5] Copies the differences into a 'package root directory' and |
---|
| 530 | runs makepkg over them. |
---|
| 531 | |
---|
| 532 | In slacktrack version 1, we used 'installwatch' which overloaded |
---|
| 533 | some of glibc's filesystem calls, creating new files and directories |
---|
| 534 | into a pseudo-root filesystem, avoiding the need to install onto |
---|
| 535 | the host's filesystem (and also allowing to build as a non-root user). |
---|
| 536 | However, this library is ill maintained and even in the early days |
---|
| 537 | when it worked well, it still had problems and workarounds were required. |
---|
| 538 | |
---|
| 539 | 4.0 Example scripts |
---|
| 540 | --------------- |
---|
| 541 | |
---|
| 542 | Included with the slacktrack binary distribution are a number of example |
---|
| 543 | scripts that hopefully should provide you with a basis of how to use slacktrack |
---|
| 544 | to build from 'dirty' source distributions. |
---|
| 545 | |
---|
| 546 | The examples are bundled in the documentation directory available |
---|
| 547 | after installing slacktrack: |
---|
| 548 | |
---|
| 549 | /usr/doc/slacktrack*/buildscript-examples/ |
---|
| 550 | |
---|
| 551 | |
---|
| 552 | 5.0 Known problems/features of slacktrack |
---|
| 553 | ------------------------------------- |
---|
| 554 | |
---|
| 555 | Current problems: |
---|
| 556 | |
---|
| 557 | [1] slacktrack doesn't have sufficient error checking. |
---|
| 558 | |
---|
| 559 | I'm in two minds about *where* to put error checking, you see. |
---|
| 560 | Do I go no further if the supplied build script exits with a non-zero |
---|
| 561 | value? |
---|
| 562 | No, that's a bad idea because what if you didn't write the build script? |
---|
| 563 | it might be one of these qmail type binary installer programs that |
---|
| 564 | you can't (easily without hacking the source) fix. The author may |
---|
| 565 | have their own systems, and the program exits with a value that their |
---|
| 566 | own controller script recognises as non-failure. |
---|
| 567 | |
---|
| 568 | What should I do if makepkg has failed? You see it on screen |
---|
| 569 | and in the logs anyway, plus makepkg is one of the last things |
---|
| 570 | that slacktrack calls -- how can you recover? |
---|
| 571 | |
---|
| 572 | That said, version 1.03 now has some error handling. There's still |
---|
| 573 | not enough though, imo. |
---|
| 574 | |
---|
| 575 | [2] No support for a default config file |
---|
| 576 | |
---|
| 577 | I don't see the point. Each .build script is different |
---|
| 578 | and although I typically use the same options to slacktrack |
---|
| 579 | for most of my build scripts, I don't see why I'd need a |
---|
| 580 | config file just to save 4 bytes or so in a trackbuild wrapper :-) |
---|
| 581 | |
---|
| 582 | |
---|
| 583 | 6.0 New features |
---|
| 584 | ------------- |
---|
| 585 | |
---|
| 586 | See the TODO file in the docs directory. |
---|
| 587 | |
---|
| 588 | If you have any specific features you would like to see |
---|
| 589 | included, or have found any bugs, please |
---|
| 590 | email me <mozes@slackware.com> |
---|
| 591 | |
---|
| 592 | 7.0 Licence |
---|
| 593 | ------- |
---|
| 594 | |
---|
| 595 | slacktrack is distributed under BSD Licence. |
---|