533 lines
50 KiB
Plaintext
533 lines
50 KiB
Plaintext
|
|
Episode: 801
|
||
|
|
Title: HPR0801: Slackbuilds
|
||
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr0801/hpr0801.mp3
|
||
|
|
Transcribed: 2025-10-08 02:45:17
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Hi everyone, welcome to Hacker Public Radio. My name is Klatsu. I have a three-part series
|
||
|
|
for you this time on packaging, actually, packaging code for Linux and BSD. So I'm not
|
||
|
|
a package maintainer. Really, I'm very, very novice at it, but I don't really hear. I've
|
||
|
|
never actually heard an episode on the subject, and I maintain a couple of packages over at
|
||
|
|
slackbuilds.org, and I built an RPM, and I built a port once. So very, very much a novice,
|
||
|
|
but in this episode I'm going to discuss slack builds. And I'm going to discuss slack builds
|
||
|
|
first, because I don't know necessarily that it was a terribly early development. I don't know
|
||
|
|
when this was all devised. I don't know the history of really any packaging formats, but I figured
|
||
|
|
it was a really good one to start with, because it is, in my opinion, the simplest to understand
|
||
|
|
that the most straightforward one of them. It's the one that I kind of started with first. So,
|
||
|
|
packaging Linux applications, of course, is a pretty important task, I think. I mean,
|
||
|
|
one of the selling points, I think, maybe not at first, but one of those things that becomes
|
||
|
|
very, very addictive and very, very almost expected at this point, is that when you are using Linux
|
||
|
|
that at some point you start to just kind of expect naturally that application that you just
|
||
|
|
heard about from someone, naturally that will be in your repository. It's just kind of a given.
|
||
|
|
So, I wanted to encourage people to look into packaging, because it's a pretty cool little trick
|
||
|
|
to know, and it can be very helpful to other people as well, because if there's an application out
|
||
|
|
there that hasn't been packaged for your favorite distribution, or that's maybe lagging a little
|
||
|
|
bit behind the curve, then you might be the person to pick that up. So, we'll get started with
|
||
|
|
slack building. Now, of course, I'm fully aware that not everyone's going to jump out of their
|
||
|
|
chair at the end of this episode, and go package stuff for slackware. But it really is a very
|
||
|
|
beautiful packaging format, the slackware packaging, because it doesn't use anything specific to slackware.
|
||
|
|
Well, it does, but it doesn't. The slackware packaging format is a shell script, and the shell
|
||
|
|
script goes through the code that you want to compile, and it sets up a little destination directory,
|
||
|
|
sort of a temporary directory, where everything is going to be compiled, and then installed into
|
||
|
|
that temporary directory. A couple of other files in the package, we'll get into that later, but
|
||
|
|
at the basis, there's this little shell script. It's the slack build itself, a shell script, and it
|
||
|
|
compiles the code, puts everything into this directory. Now, if you look at this directory, inside the
|
||
|
|
directory, there is, if you go into that directory, you would almost think you were inside of your
|
||
|
|
computer, because you'll see really familiar folders, like, slash usr, and slash etsy, and you'll
|
||
|
|
think, gee, what's in there? So you go into slash usr, and look at that, there's a slash bin,
|
||
|
|
going to slash bin, and there's the program that you were compiling, the binary for that program.
|
||
|
|
Back out of there, go into the etsy directory, maybe, and maybe there's another folder in there,
|
||
|
|
or maybe not, but there's a dot-conf file for the application that you're compiling, and then maybe
|
||
|
|
you go back out, and there's a slash usr, slash share, slash doc, and then there's the documentation.
|
||
|
|
So basically, this little destination directory is a little tiny clone of a Linux system,
|
||
|
|
without anything in it, except the application that you want to compile. So you've just taken
|
||
|
|
source code, you've compiled it into its own little folder. It's completely bundled up in this
|
||
|
|
one folder with lots of subfolders that correspond exactly to a Linux system, so that if you,
|
||
|
|
specifically, do a Slack system, but that's pretty universal. So if you overlay that directory onto
|
||
|
|
a Linux system, then suddenly you've installed that application, makes sense, right? So in theory,
|
||
|
|
of course, you could go through, and you could give that folder to people, you could zip it up,
|
||
|
|
and give it to people, and they could unzip it, and they could move everything that you've compiled.
|
||
|
|
If it was compiled for their architecture and everything, they could move everything that was
|
||
|
|
compiled onto their computer in the corresponding places, meaning if it's this destination directory,
|
||
|
|
they see a U.S. slash U.S. R slash bin slash whatever, then they'll take that whatever, and they'll
|
||
|
|
put it in slash U.S. R slash bin slash whatever, and then they would go into the slash U.S. R slash
|
||
|
|
share slash dock, and they would take all the documentation and drop it into their own slash
|
||
|
|
U.S. R slash share slash documentation. And the same thing for the Etsy config file, they would take
|
||
|
|
the, they would take it out of the Etsy folder in their little destination directory, and they'd
|
||
|
|
put it into their own computer's Etsy folder. And if you think about it, that's all installing
|
||
|
|
software is, right? There's nothing really magical going on there. Now the one thing that is a
|
||
|
|
little bit magical, or it might seem that way, is that there are dependencies. There's code on the
|
||
|
|
computer that when you're building that application, it kind of wants to see that code, it wants to
|
||
|
|
build against that code. If the user doesn't have that code on their computer when they're compiling
|
||
|
|
the code, then that application isn't going to be able to compile. And that of course is a dependency,
|
||
|
|
that's what that's all about. So for this reason, slash building is kind of one of the easier
|
||
|
|
packaging formats because it doesn't do dependency resolution. It doesn't do any kind of checking.
|
||
|
|
It simply runs the dot slash configure or whatever option that particular brand of compiling takes.
|
||
|
|
It's usually a dot slash configure. And if the dot slash configured check fails, then it cannot
|
||
|
|
proceed to actually make the program. So the burden is on the user, the slackware user, to resolve
|
||
|
|
their own dependencies. So enough talk. Let's just go ahead and build something. And the program that
|
||
|
|
I've chosen to build in all three of these demonstrations in each episode is the little program called
|
||
|
|
Yes, Please. Yes, please is a little C application, I think, by Sigflup. You remember Sigflup of
|
||
|
|
Hacker Public Radio. She's a great programmer type person. And she came up with this Yes, Please
|
||
|
|
program that will take a screenshot of your computer screen of your desktop. And then it will
|
||
|
|
automatically upload it to the fine website, UnixPorn.com. Now UnixPorn, of course, is not porn,
|
||
|
|
it's Unix. And it's a place where people can post their desktops, just whatever they're looking at,
|
||
|
|
you know, during the day on their Linux machine or BSD or whatever, Solaris, whatever. And they can
|
||
|
|
post it on there, then everyone gets to see, you know, how they have their computer set up. So it's
|
||
|
|
just gratuitous screenshots, basically. So you need an account over at UnixPorn. It's a free
|
||
|
|
account. It's just like me and the last name God and Cobra 2, it admin the thing. Oh, and I think
|
||
|
|
330 technically, we're admitting the thing. And you can just use Yes, Please to upload to it
|
||
|
|
straight from the command line. It's a really slick little application and it's got just enough
|
||
|
|
complexity, I think, to make it not a completely easy script to write, you know, a package to write,
|
||
|
|
but it's at the same time it is very simple because it's a very small application. So let's take a
|
||
|
|
look at it. The Yes, Please source is currently at least the one that I've built packages for is
|
||
|
|
Yes, Please underscore, underscore four, that's August and August, underscore four, underscore
|
||
|
|
twenty ten dot TGZ. That's the source file that that SIGFLOB distributes. That's the source code
|
||
|
|
and everything in there. So for a Slack build, what you would do is you would grab that source.
|
||
|
|
Well, actually, I should start out by saying this is going to be common on all three packaging
|
||
|
|
formats that are all three that I'm going to cover. Sorry, I didn't mean to imply that they were
|
||
|
|
the only three packaging formats. If you think that those are the only three packaging formats,
|
||
|
|
go listen to HPR episode seven thirty three by Marcos where he talks about just how many
|
||
|
|
packaging formats there really are, but I'm doing Slack builds RPM and port because those are the ones
|
||
|
|
that I learned and that's why I'm doing them. I mean, Slack builds and RPMs, I actually use a lot.
|
||
|
|
Port was kind of fun and the other ones I just I haven't gotten around to really looking into
|
||
|
|
them. So for any package that you're going to be doing, it's a good idea to have kind of an
|
||
|
|
environment, like a building environment setup, as well as a clean install setup. Those are two
|
||
|
|
tall-ish orders because if you're lazy, you won't want to do them, but it is important to do them.
|
||
|
|
Especially for something like RPM, which apparently was traditionally at one point kind of done by
|
||
|
|
root because it had a lot of, you know, it was, it was the RPM builds were done outside of the
|
||
|
|
home folder and stuff like that and people kind of decided, you know, that's really crazy to be
|
||
|
|
just sitting in root all day while you're packaging this thing up. And yeah, it's probably true,
|
||
|
|
it does seem pretty crazy. So it's a good idea to kind of make your own packaging identity.
|
||
|
|
And I mean, I always have two users, at least two users on every computer I have. My everyday
|
||
|
|
normal computer usage and then a another account just kind of just they're hanging out because I
|
||
|
|
like to have multi-users just because I like to explore what what interesting things happen when
|
||
|
|
you have two users, even though they're both me. But so if you can do an ad user or a user ad,
|
||
|
|
whatever you've got on your system and just create a new user for yourself who will be your
|
||
|
|
packaging identity, that's not a bad idea. Now at the same time, before you go doing doing that,
|
||
|
|
another way about that, and this isn't a bad way, believe me, is to just grab Qemu,
|
||
|
|
Qemu, however you say that, the virtualizer and grab the latest distribution of your
|
||
|
|
distribution and fire up an instance of Qemu and do a little install of that. Qemu, I've done either
|
||
|
|
a hacker bullet radio episode on it or I've done a bin rev blog, which is also now sort of mirrored
|
||
|
|
over on my go for space point go for like in links or in Firefox go for colon slash slash slacker
|
||
|
|
media dot info colon 70 and you'll find a link to my go for space from from there. So you can look up
|
||
|
|
the Qemu tutorial on in my articles and it's a really simple one. I like using Qemu because it's
|
||
|
|
just it's fast and it's easy. You don't have to worry about installing a whole virtual machine
|
||
|
|
client, you know like virtual box or anything or vert manager or anything like that. You can just
|
||
|
|
fire up a quick instance of Qemu, Qemu make a make a disk image and then install your your
|
||
|
|
distribution on there. Do a minimal install possibly and and you're you're good to go. You don't
|
||
|
|
even need X for I mean it's really this is all going to be on the command line so you can just
|
||
|
|
install a really simple version of your of the distribution that you're packaging for and it really
|
||
|
|
is quite important to do this in a virtual machine because I cannot tell you how many times before
|
||
|
|
I really really understood packaging, not to say that I really really understand it now but I
|
||
|
|
certainly understand a better than I did when I was first starting out but I can't tell you how
|
||
|
|
many times I would write a slack build on my machine for it is swearing that I've got a fairly clean
|
||
|
|
machine and and of course there'll be something that I just I forgot that I had installed a hugely
|
||
|
|
major dependency of this application and I just never noticed that it's there because I've already
|
||
|
|
got it on my computer whereas if it was a clean install a completely clean install and I was packaging
|
||
|
|
the thing I would have known right away that when I did the dot slash configure oops it didn't work
|
||
|
|
because you know such and such was missing so it's very important to have a really really clean
|
||
|
|
install so that you're building against what you really kind of have to assume everyone else is
|
||
|
|
going to be building against you have to assume that they're starting from a from from ground zero
|
||
|
|
from the ground up from their distribution okay so that's very important it's all free it's very
|
||
|
|
easy to get started the next thing I guess would be if you're not familiar with compiling software
|
||
|
|
if you're not completely familiar with compiling software I did an episode on that over on
|
||
|
|
new world order for sure so that's augcastplanet.org slash canoe world order I don't remember the
|
||
|
|
episode number but it's an episode completely about compiling software so if you're not familiar
|
||
|
|
with it and you feel like I'm rushing through parts in this episode you can either go listen to that
|
||
|
|
and yes please like I say is a really good little application to practice on too so if you haven't
|
||
|
|
compiled that often and you want just sort of practice yes please is great because there's a couple
|
||
|
|
of little dependencies and then you can resolve those and suddenly you're building and it works
|
||
|
|
and and everything's great okay so we've grabbed the yes please source from the from the homepage
|
||
|
|
and you know honestly the easiest way to get there the the way that I get there is I simply go to
|
||
|
|
slackbuilds.org because I mean heck that's what we're doing anyway and you can even grab the slack
|
||
|
|
build if you want to kind of follow along as it were so if you go to slackbuilds.org down at the
|
||
|
|
bottom of well at the top of the page there's a search box and it'll be set by default to 13.37
|
||
|
|
so just put in the word yes please and that is yesplz and then hit return and it'll take you
|
||
|
|
to the yes please slackbuild and you'll see a read me with some asky art that doesn't quite
|
||
|
|
translate very well to to html unfortunately and then you'll see a source download with the MD5
|
||
|
|
sum next to it you can download that to your computer and then right underneath that you'll see
|
||
|
|
download slack build and that's that's going to be yes please dot tar dot gz and that is uh
|
||
|
|
signed gpg sign so you can verify it that and uh then you should have in your little packaging
|
||
|
|
identity wherever that is whether it's on a virtual machine I make a directory called slackbuilding
|
||
|
|
and I put the source and the the slack build template that I'm going to use uh which slackbuilds.org
|
||
|
|
actually even provides so in terms of getting it to work it's a great starting point okay so I'm
|
||
|
|
going to just untar this yes please dot tar dot gz so that's the slack build itself not not the
|
||
|
|
source code just the the actual slack build like I've said there are about well there are about
|
||
|
|
there are either four or five essential files in a slack build again this will be really similar
|
||
|
|
in rpm and everything like that it's they've typically got a pre standard format and they're
|
||
|
|
actually more similar than they are not in in many ways so um the the first file is the easy
|
||
|
|
one that's the read me those are always good to have I tend to be very I tend to try to be very
|
||
|
|
verbose in my read me I never want to assume that someone's coming to slack builds and getting
|
||
|
|
yes please because they know everything and they're doing it all from the command line in one command
|
||
|
|
that's just you know I like to try to assume that people are going to need a read me if they're
|
||
|
|
reading the read me they probably want the information at the same time I don't want to go on and on
|
||
|
|
either I want to kind of be informative up at the top and then kind of break it down for people
|
||
|
|
down at the bottom having said that the yes please read me is marvelously useless I should probably
|
||
|
|
work on that but usually my read me's are quite helpful but the read me there's no format there's
|
||
|
|
no requirement the read me is a read me it's it's something that you can talk to the user
|
||
|
|
through and kind of help them do whatever you think that they need to do in order to get that
|
||
|
|
thing installed okay so the next one is a little bit more specific actually quite specific it's
|
||
|
|
called the slack slack slack dash description really but it's dash d e s c and it's very very
|
||
|
|
specific about what you must do it has a handy little ruler at the top which is a bunch of dashes
|
||
|
|
it's got the application name down the left side of the document and then it's got play a place
|
||
|
|
for text so it's about I think it's probably about 80 characters wide I would imagine or 79 or so
|
||
|
|
within that handy ruler and then you've got 11 lines to use so you can say whatever you need to say
|
||
|
|
in that 11 lines but you have to be careful not to go over that or go outside of that that
|
||
|
|
ruler because what they're going to do is crop all that junk off and and show the contents of
|
||
|
|
the slack description within the little package management tools that slackware ships with by default
|
||
|
|
so you have to follow the format here and of course in any packaging format you're going to find
|
||
|
|
that there's files that are very specific obviously because it's all scripted right I mean
|
||
|
|
so they need everything to be exactly the same all the time so traditionally in the slack description
|
||
|
|
you place the title at the top of the of the description of the 11 lines of description then
|
||
|
|
you give like a brief description of what exactly this is so that when people are kind of just
|
||
|
|
browsing through the packages they'll see oh yes please the sigflux unix porn.com CLI screenshot
|
||
|
|
and upload tool okay I get it that sounds interesting I'll download that and then typically it's
|
||
|
|
very handy at the bottom of your description to either have like a link to the home page of
|
||
|
|
that software so that they can go check it out if they want to but also definitely have what
|
||
|
|
dependencies are required so I simply write this requires for instance in this case lib jpeg x11
|
||
|
|
and p threads now in this case happily because it's slackware all of those are included in a stock
|
||
|
|
slackware install so the user actually doesn't have to go out and resolve any dependencies they can
|
||
|
|
simply go to yes please they can they can do the the install script and and that's it that's the
|
||
|
|
end they don't have to do anything so like I said yes please is kind of easy and yet it's kind of
|
||
|
|
complex just complex enough were this a non-standard stock slackware install for instance maybe this
|
||
|
|
person is a pro they've been using slackware a lot they know that they never use jpegs so they
|
||
|
|
just didn't even bother installing lib jpeg or maybe even more realistically they they don't
|
||
|
|
really use excellent let's just say that they don't have some one of those dependencies when they
|
||
|
|
read that they'll say oh gee I guess lib jpeg is actually required for this I better go install
|
||
|
|
that and then they can pull that package down from from the slackware server and install that and
|
||
|
|
then they can install yes please so it's manual dependency resolution it's a beautiful thing
|
||
|
|
because you actually know what's going into your computer and you actually get to compile it
|
||
|
|
the way that you want to if if it's that important to you but I digress so that's the slack dash
|
||
|
|
dc or description file the third file that one would do is the yes please dot info file the dot info
|
||
|
|
file is again very structured very specific as to how it needs to be structured and this you're
|
||
|
|
going to you're going to really well I mean again once you see all these packaging formats it's
|
||
|
|
going to all kind of start to look really really familiar to each other so that's kind of kind
|
||
|
|
of neat so um the yes please dot info file starts with a program name or PRG and AM and that equals
|
||
|
|
in this case quote yes please end quote next line is version this is tricky with sigflux yes please
|
||
|
|
because she didn't follow any kind of uh established at least that I know over that I can tell
|
||
|
|
an established method of naming her program so the version in this case is AUG underscore four
|
||
|
|
underscore 2010 now more traditionally like if you read up on packaging and you go to like fedora
|
||
|
|
documentation and read up on how to do RPMs or the bsd packages uh porter's handbook then you'll
|
||
|
|
you'll read up and they kind of have like this thing about you should follow this convention it's not
|
||
|
|
law or anything like that but it's a convention and that is that you have your program name and then a
|
||
|
|
dash and then your version number and then the compression and that's just kind of how it's done
|
||
|
|
fairly universally I've found in my very limited experience as a big famous package maintainer
|
||
|
|
with all my like three or four packages that I have so uh sigflux flew in the face of that convention
|
||
|
|
and and just named it the month and the day and the year that she she actually released that
|
||
|
|
version of it on and and at first I didn't really see a problem with that until I started building
|
||
|
|
packages for it and it seems like every packaging the language as it were or convention out there
|
||
|
|
demands something completely different but that's that's okay that's what makes this one a little
|
||
|
|
bit fun so in this case we're just doing the whole string as the version homepage is uberlead hacker
|
||
|
|
force dot deep geek dot us and then the download equals hgtp colon slash slash hobones dot dog soft
|
||
|
|
dot net slash yes please underscore aug underscore four underscore twenty ten dot t gz so that's all
|
||
|
|
the information so far that that the that like someone like you or me if we just have the slack build
|
||
|
|
we could look at that file right there and figure out where to go to read up more about the application
|
||
|
|
and even the direct link to these to the source code for which this slack build is created MD5 sum
|
||
|
|
self explanatory uh and then there's a separate download link and a separate MD5 sum for an x86
|
||
|
|
underscore 64 version that is obviously only to be used if these are binary packages that were
|
||
|
|
installing uh but we're compiling from source here so there is no separate download for x86 64
|
||
|
|
so we don't need to fill that in we can leave those empty just two empty quotes maintainer is oh
|
||
|
|
look there's my name uh the email clatoon at um member dot fs f dot org and then approved by my
|
||
|
|
friend and fellow slackware and slack build user decimero who I actually interviewed at
|
||
|
|
southeast linux fest but the recorder wasn't really on the right way so it didn't quite work
|
||
|
|
okay so now finally finally we get into the actual build script itself and this is uh yes please
|
||
|
|
dot slack build and once again there's that convention you have to do the the the name of the
|
||
|
|
application and you know capitalization and everything like that it counts so it's yes please
|
||
|
|
dot slack build where the s and the b are both capitalized that's how it's done you don't want to
|
||
|
|
deviate from that so like I say slack builds they come with some great templates and if you go to
|
||
|
|
the get repository of slack builds they have even I mean they've got some good templates on the website
|
||
|
|
slack builds dot org if you go to their get repository they have templates for everything for
|
||
|
|
pearl applications for automake applications which is which this is uh for seemake stuff for
|
||
|
|
java stuff it's just got all kinds of templates which are really really helpful but generally speaking
|
||
|
|
the I mean obviously I'm not going to just read this line by line so if you want to if you want
|
||
|
|
to go get the package the slack build package and then read through the code yourself that would be
|
||
|
|
a good idea most of this is not even my code um this was a really a pretty simple slack build so
|
||
|
|
a lot of this is basically just robby workman and and and decimero and and um all the guys over at
|
||
|
|
slack builds it's just kind of their their scripts that everyone else gets to kind of modify and tweak
|
||
|
|
and leach off of and makes you feel really good about yourself because you wrote a slack build
|
||
|
|
when really you did like you know ten percent of the work but that's ten important
|
||
|
|
percent okay so the program name reiterated here in the script because we need the variable uh
|
||
|
|
is yes please the version org underscore four underscore twenty ten the build is dollar sign curly
|
||
|
|
bracket build colon dash one uh curly bracket and that's what that is going to do is append a dash
|
||
|
|
one to the end of the script like after we've built everything it's going to have a dash one to show
|
||
|
|
that this is build build one um and then a tag and the tag is an underscore SBO so all the slack build
|
||
|
|
files all the packages that you build via slack builds will have that tag underscore SBO if you
|
||
|
|
go and download a slack build from say alien bob's website who beets a lot of cool packages uh
|
||
|
|
then he'll have an underscore alien tag for my personal packages that I I build for myself but
|
||
|
|
I don't submit the slack builds for whatever reason which isn't all that common to be honest but there
|
||
|
|
are some things where I know that the slack build already exists but I don't want to submit uh I don't
|
||
|
|
want to use their slack build so I'll modify it heavily or I'll just do my own version and then I'll
|
||
|
|
have it on my computer so I'll have the underscore class too so you can tag your files just to kind
|
||
|
|
of differentiate where these packages came from notice here as well that we're using variables
|
||
|
|
right here at the top of the script that's such a great habit to get into because then you don't
|
||
|
|
have to you know you you you establish your variables right up at the top and then you don't have
|
||
|
|
to go through the script and like do a said replace or anything like that you know it well you know
|
||
|
|
said um you don't have to replace stuff because you only list it once at the very top of the script so
|
||
|
|
if if sigflup comes out with a really cool new version of yes please on august 8th 2011 you don't
|
||
|
|
have to go through and change that everywhere you just simply go into your slack build file you
|
||
|
|
change the version you close it and you build it and suddenly you've just updated your slack build
|
||
|
|
so this is very very efficient and of course I'm marveling over it but it's probably like
|
||
|
|
something that programmers have done for for years and years and years I think it's really smart
|
||
|
|
though the next chunk of code I'm not going to read through but it's basically and well it is
|
||
|
|
it's an if statement with a little case loopy thing in it and it's establishing the architecture
|
||
|
|
of the machine and it's done really really well this is like just cool good old fashioned
|
||
|
|
bash parsing kind of stuff where you you simply tell it to do a you name dash m and if the value
|
||
|
|
returned from you name dash m is for instance i 486 or i i something 86 then we set the architecture
|
||
|
|
as i 486 if it is arm then we set the architecture or arch ARCH to arm and if it is anything then we set
|
||
|
|
the architecture to whatever that value is so it's a really cool kind of auto detection kind of
|
||
|
|
technique I have taken that chunk of code right there simple that may be probably I've taken that
|
||
|
|
and just used it on so many different things so many little bash scripts that I've written where I
|
||
|
|
just want to get a value and then examine it and and set some other variable to whatever that
|
||
|
|
returned that's it right there it's it's just it's done for you just go get the template and rip
|
||
|
|
off the code it's really cool okay so then we set some more variables and this is kind of cool
|
||
|
|
because we most importantly we set a temporary directory to slash temp slash sbo we set a package
|
||
|
|
to something inside of that temporary directory slash package dash program name so meaning
|
||
|
|
that as we build this package or as slack builds you know the automated script as it builds this
|
||
|
|
package it's going to put everything into slash temp slash sbo slash package dash program name so
|
||
|
|
in this case it'll be package dash yes please so this is good to know because if if you were
|
||
|
|
packaging and it fails a few times you can go to slash temp slash sbo slash package dash you
|
||
|
|
yes please and look inside of there and see what did you know how far did it get what what's going
|
||
|
|
on inside of that package that we're trying to form and then the output is set to slash temp then
|
||
|
|
we go through and set some compiling like some make flags basically and it does this based on
|
||
|
|
that variable that we established just a minute ago where we did the you name dash m so we did
|
||
|
|
new dot new name dash m and whatever that returned and if you don't know what you name dash m does
|
||
|
|
open up a terminal right now and type in you name dash is space dash m and you will see that
|
||
|
|
it actually gives you the exact architecture of your machine so in this case it's x86 underscore 64
|
||
|
|
on the computer that I'm using right now so we did a you name dash m we got some value and then
|
||
|
|
we took that value and set the variable arch ARCH equals you know whatever value we got back from
|
||
|
|
you name dash m so in this chunk of code we're saying okay so if the value of arch equals i
|
||
|
|
486 then slkc flags equals quote negative oh two space dash m arch equals a 486 space dash m tune
|
||
|
|
equals i 686 closed quote libder suffix is nothing because it's a 32-bit system there when you go
|
||
|
|
a libder like slash usr slash lib or slash lib it's just slash lib that would be as opposed to
|
||
|
|
for instance a couple of lines down where it says else if the value of arch equals x86 underscore 64
|
||
|
|
then slkc flags equals dash zero to space dash f pick and the libder suffix equals 64 so this is
|
||
|
|
very important stuff because it's looking at the architecture of your computer and setting some
|
||
|
|
pretty common little flags that you you want to maybe keep in mind when you're compiling software
|
||
|
|
and then we do a set space dash e the set space dash e means that we're going to exit the script
|
||
|
|
if there are errors this is such a great great thing and I never really understood why it was done
|
||
|
|
in slack builds I always kept it in because it was in the template I didn't have a deep understanding
|
||
|
|
of why it was done and then I started doing a lot more scripting at my job and I would run a script
|
||
|
|
and it would run through the whole script and then I'd look at the results and it turns out that
|
||
|
|
half of the script didn't actually get done and I would always think to myself why did it
|
||
|
|
continue going if if it couldn't even find that directory you know and just kept kept working but
|
||
|
|
it it was missing like half of the things that I asked it to do well it turns out that I had never
|
||
|
|
said it to to stop there was no there was no warning that hey if you encounter errors then bail
|
||
|
|
so set space dash e will help with that sort of thing rm space dash rf space dollar sign package
|
||
|
|
why would we do that well think about it if you're if you're building the package and you're trying
|
||
|
|
to build it and it fails so then you try again well you don't want to try to build the package into
|
||
|
|
itself right you don't or have some kind of conflict where it says directory already exists
|
||
|
|
so as part of a fairly early step in this process is to look and see if an existing dollar sign pkg
|
||
|
|
exists and if it does remove it recursively and forcefully the forcefully flag of course is set
|
||
|
|
because otherwise it might if if we have rm set to um rm dash i then it would ask us hey are you
|
||
|
|
sure you want to remove this and we don't want that we want our script to run very very silently
|
||
|
|
so rm dash rf dollar sign package and then we make some directories we make a directory
|
||
|
|
called dollar sign temp dollar sign package and dollar sign output and you'll remember of course
|
||
|
|
that those are variables that we set earlier in the script temp was set to slash temp slash sbo
|
||
|
|
package was set to being in the the temporary directory slash package dash yes please or
|
||
|
|
really program name but in this case yes please and then output was set to slash tmp you'll
|
||
|
|
notice that there's a dash p flag after the maker and what that stands for what that means is
|
||
|
|
to make any necessary parent directories turns out that this is a really handy trick to know because
|
||
|
|
if you're ever making a number of folders like you want to make a i don't know directory of a bunch
|
||
|
|
of skinny puppy albums so you'd say make your skinny puppy and then you'd have to go into skinny
|
||
|
|
puppy and then you'd say make their vivisect and then you'd say make their um maybe inside of that
|
||
|
|
you'd you'd have the the remixes and the normal ones you know if you wanted to do that you could
|
||
|
|
just do it with one command by saying make all the parent directories that are needed so you could
|
||
|
|
say make your dash p skinny puppy slash vivisect slash vivisect live and then again for the whatever
|
||
|
|
but the point is that you can actually it will make everything leading up to that directory for
|
||
|
|
you you don't have to actually do it in separate commands it's quite nice um that was way over
|
||
|
|
complex for a very simple explanation uh so then you cd into slash into uh temp you're sending
|
||
|
|
the shell script you know the the executor of the shell script into the temporary directory
|
||
|
|
this can get complex because you have to remember where these commands are being executed from
|
||
|
|
this is something i try to actually avoid in my own shell scripts because i always get confused
|
||
|
|
happily a lot of this is pre scripted in the slack build so you don't have to really keep track
|
||
|
|
of it as much if it's a simple compile it's not always that simple so sometimes it does become
|
||
|
|
tricky and again you do an rm dash rf of the program and the version just in case it's already
|
||
|
|
in progress if it's being built in that temp directory and then you untar and un gzip or whatever
|
||
|
|
needs to be done that program version so this is the source code that the user will have downloaded
|
||
|
|
on their own and placed in that directory and it's going to need to untar it now that's a line
|
||
|
|
that obviously you're going to have to change if your source code was tar.gz or tar.bz2 or
|
||
|
|
.zip whatever it might be that's kind of a line that you're going to have to keep an eye on if you're
|
||
|
|
building a lot of slack builds from from a template file uh and then notice that we cd into that
|
||
|
|
program version and we change the permissions this is again something that's going to be fairly
|
||
|
|
constant in the packaging stuff where you have to keep in mind that we're building and distributing
|
||
|
|
on linux and and unixy systems so permissions actually are going to matter the next chunk of code we
|
||
|
|
we do what we basically do the we set the c flags for the for the comp the the compilation
|
||
|
|
process and we do a dot flashed in figure with all of the associated options that you may or may
|
||
|
|
not want to have and this is kind of an important thing at least to me uh it it helps you keep everything
|
||
|
|
very consistent and it helps you make sure that everything actually works but things like setting
|
||
|
|
the prefix or setting the what what library directory you want to refer to where your configuration
|
||
|
|
files are kept and some programs like you know the more complex programs like ffnpeg I mean there's
|
||
|
|
a million different options can drink configuration that you can pass so uh audacity too there's
|
||
|
|
a bunch of different ones so sometimes you'll see a list of configuration options that just take up
|
||
|
|
well your whole screen really I mean it can be very complex so that's a very important part and
|
||
|
|
the only way to find that out and really the only I think the only way to do a slack build
|
||
|
|
properly is to go through the actual source code and run through the compile the the compilation
|
||
|
|
process a couple of times so if we go to the source directory with if we um we untar it
|
||
|
|
ungeezip it and go into it and just do a dot slash configure dash dash options or dash dash
|
||
|
|
help I'm not sure it it seems to depend on unlike the uh on the program itself I've seen both I
|
||
|
|
don't know what the uh the deciding factor on that is but the dot slash configure dash dash help
|
||
|
|
will show you a full list of all the potential configuration options that you can pass to the
|
||
|
|
dot slash configure process so in this case it's it's it's still a screen full I mean it's a pretty
|
||
|
|
it's it's I've never really seen one of these it's just a couple of lines but if you read through it
|
||
|
|
there's some really important stuff you know it's just kind of some of the stuff you don't even
|
||
|
|
have to set because there are defaults and it tells you what the defaults are for instance the
|
||
|
|
mander wherever the man file is going to go dash dash man dir equals some dir and then it says
|
||
|
|
well in square bracket graph square brackets that is prefix slash man well what is prefix
|
||
|
|
we'll go up a little bit to where the dot slash configure option tells us what the prefix is
|
||
|
|
and it says okay the prefix is dash dash prefix equals prefix and the default is slash usr slash
|
||
|
|
local and that's actually kind of funny I don't think I don't remember noticing that before
|
||
|
|
I actually like usr slash local as my as my default prefix but I I don't know that that's
|
||
|
|
always the prefix that it's usually just slash usr it seems like a lot of distributions and things
|
||
|
|
are going away from the slash local folder but yeah that's always interesting to look at but
|
||
|
|
anyway the the dash dash man dir obviously would not be something that we would need to specify
|
||
|
|
if if the default was something that we were perfectly happy with but if you want to override
|
||
|
|
that then you certainly can do that as well and in fact it looks like in this script we do override
|
||
|
|
a prefix we have dash dash prefix equals slash usr so it's not going to be slash usr slash local
|
||
|
|
it's just slash usr and that is to keep it consistent with the rest of slackware of course if
|
||
|
|
if for some reason you felt like it doesn't belong in slash usr slash whatever like slash bin
|
||
|
|
or slash share slash man whatever or slash share slash man whatever path is going to kind of
|
||
|
|
cascade down from different components of what you're compiling and installing you could
|
||
|
|
always change that prefix and it's done it's done sometimes on on particularly large or maybe
|
||
|
|
somewhat intrusive applications you'll see things that installed themselves to slash opt slash
|
||
|
|
local slash bin or to slash usr slash local slash bin whatever one of those two sort of classic
|
||
|
|
this was installed by a third party or you know not a default system kind of application
|
||
|
|
so for for us though we're just going to do a simple slash usr to be nice and consistent with
|
||
|
|
the rest of slackware then we do a yes a make yes please and you can see that I did a comment in
|
||
|
|
there that says make install is broken and installs the file to the build system now this is
|
||
|
|
funny I wish I'd read this note to myself a long time ago actually because I think I when I
|
||
|
|
built it I obviously knew that then when I was doing the RPM of yes please I ran into that same
|
||
|
|
problem and spent like a day trying to fix it and I'm just actually just now seeing again my own
|
||
|
|
note to myself in here but yeah so sigflup used an install script that her I think her make file
|
||
|
|
refers to the install script it it runs that install script and that install script gets some kind
|
||
|
|
of option from you know the environment that you're in and and so far on at least two of the
|
||
|
|
systems that I've built a package for I know it happened on slack build and I know it happened
|
||
|
|
on RPM that install script just didn't quite didn't match up with with the the packaging that
|
||
|
|
that I was doing I could be doing something wrong but but that's that's what I found so we do
|
||
|
|
simply make yes please and then we do an install dash d dash m 0 755 dash s and then dollar sign
|
||
|
|
program name space dollar sign package slash us slash bin slash program name so what we're doing
|
||
|
|
there is very very explicitly telling the install where to put the binary that it's about to compile
|
||
|
|
so the make command when we said make yes please what we're doing there is calling out a very
|
||
|
|
specific option in sigflup's make file so if you go back to her source code that we just
|
||
|
|
unzip to look at the configure options if we go into her make file well you won't see a make file
|
||
|
|
unless you did the configure but you will see a let a make file dash dot i in if you do a less on
|
||
|
|
that or cat or more whatever you prefer then you will see that on the left side of the the make
|
||
|
|
file there are words and then series of commands after them so you've got like I'm I'm looking
|
||
|
|
down under all the c flags and prefixes and stuff you see yes please and that's simply doing one
|
||
|
|
thing and then you see an install so if we'd said make install what would have happened was yes please
|
||
|
|
jamaud plus x dot slash install dot s h and then dot slash install dot s h s please to the prefix
|
||
|
|
to the bin to yes please so it's kind of hard coded in her make file to do a certain set of commands
|
||
|
|
that we actually don't want to do so we simply want to make the binary we don't want to install it
|
||
|
|
at least not the way that she is installing it and then on the separate line in our own script we
|
||
|
|
said install dash d space dash in whatever and then we said here's where we want you to put the
|
||
|
|
the binary which of course isn't in our system we're not really installing yes please we're installing
|
||
|
|
it into that fake little clone that destination directory that we've created and where is that
|
||
|
|
directory do you remember look up in the script you'll see it yes exactly it's in slash temp slash
|
||
|
|
s b o and then of course it's slash package dash yes please so that's where we're actually installing
|
||
|
|
everything so if you if you think about it when all we're doing is a normal everyday source code
|
||
|
|
compile but every step of the way where something's actually getting compiled we're redirecting all
|
||
|
|
of the output to the fake system with this fake slash usr slash bin and a fake slash usr slash
|
||
|
|
share slash dock and a fake slash Etsy and and all these other in a slash a fake slash lib so
|
||
|
|
that's that's all that's happening in a package you're you're you're you're building and putting
|
||
|
|
it into one location that isn't your system because you don't want to put it into your system yet
|
||
|
|
you want to put a new package that you can then distribute among your friends or you can say okay
|
||
|
|
computer now I want you to overlay this package onto your file system so that of course later on
|
||
|
|
when you get tired of that application or when you want to upgrade it you can very cleanly
|
||
|
|
how you have a record of everything that you've just done and you can uninstall or you can upgrade
|
||
|
|
without going through jumping through hoops and that's I mean that's what packaging is all about
|
||
|
|
right that's why people keep applications and packages and don't just keep installing everything
|
||
|
|
straight out of source code all right so we've got a package that we've installed now there's not a
|
||
|
|
whole lot of documentation with sick of flops application but there is a read me file and it is
|
||
|
|
it it seems to be a convention of of all the packaging stuff that I've seen so far again all
|
||
|
|
well three of them that I've actually looked at that if there is documentation then basically you
|
||
|
|
I mean even if it's not like a man page or something then you're going to keep track of it you're
|
||
|
|
going to install that onto the system as well as considered part of the application so in this
|
||
|
|
case we are going to make a directory without dash p flag again you remember how I explained
|
||
|
|
that that makes all the parent directories and we'll put that into of course our package so that's
|
||
|
|
the package the dollar sign pkg variable and then just like I said this in we're going to put it into
|
||
|
|
slash usr slash doc slash program dash dollar sign version I kept saying slash user slash share
|
||
|
|
slash doc I guess it's just slash user slash doc and then we're going to copy all of the documentation
|
||
|
|
over there which in this case is all of one file so you copy cp dash a that makes sure that you
|
||
|
|
get everything recursively and maintains all the different permissions and stuff like that I think
|
||
|
|
and then we've got a little slash but we're really we're just saying copy the read me file to that
|
||
|
|
one destination that we've just made which is the slash usr slash doc slash program version which
|
||
|
|
of course isn't the real one it's the one in our destination directory our package and then we
|
||
|
|
we we we cat the slack build itself into that folder as well into that directory as well why copy
|
||
|
|
when you can cat and why cat when you can copy it's kind of like in the slack book if you've ever
|
||
|
|
read that or if you're ever going to go read that they've got like in the same kernel compile lesson
|
||
|
|
they've got like two or three different ways of copying a file and there's like literally line
|
||
|
|
after line it's just like why did they copy that and cat that and to this day I don't know but you
|
||
|
|
know it's it's helpful to to kind of see all the different ways you can do things um and finally
|
||
|
|
we're going to make a make der dash p in the package slash install and into that install folder we
|
||
|
|
are going to cat from the current directory the slack where the slack dash description file and now
|
||
|
|
if there was a man page that was built for this and there isn't there's a yes please space dash
|
||
|
|
dash help but that's not a file that's part of the program itself so there is no man page so we're
|
||
|
|
not going to do anything with man pages this had no pearl or or um you know this didn't have
|
||
|
|
anything else involved so there's no meta little hidden things to strip out or get rid of so again
|
||
|
|
this is a pretty simple build comparatively but at this point we could do all kinds of cleanup
|
||
|
|
and again you're going to see this in the other packages where the after you've installed it
|
||
|
|
you you want to kind of clean up after yourself and make sure that you're not leaving a whole
|
||
|
|
bunch of bits and pieces lying around for for your user to have to clean up on their own tidy up
|
||
|
|
a little bit and after that you see the into the package and you issue what is a distinctive slack
|
||
|
|
where application called make pkg and that is it resides in slash s bin slash slash make pkg and so
|
||
|
|
we're basically converting everything in this directory that has the exact correct structure and
|
||
|
|
skeletal form of a slack package and it's it's taking all that stuff and putting it into well
|
||
|
|
really just a tar g zipped archive so make package make pkg while I say it is specific to slackware
|
||
|
|
it actually isn't specific to slackware at all because if you do a less on slash s bin slash
|
||
|
|
make pkg you will see the shell script and all the code or you know you'll you'll see the
|
||
|
|
the application right there and it's just a bunch of unique stuff it's it's normal every day
|
||
|
|
bash kind of shell kind of stuff that anyone could do so this is a really really I just can't
|
||
|
|
get over how like beautiful this this format is because it is just it's pure
|
||
|
|
unix it's just a bunch of shell scripting and it's just so effective why is it so effective
|
||
|
|
well before we go into that we should run the script and see what actually happens so the way
|
||
|
|
that you run a slackware script or a slack build script rather is that you've got your folder you've
|
||
|
|
got your little slack build folder with our for obligatory slack build files in it and you place the
|
||
|
|
source code package all zipped up and everything just like you got it from the internet you place
|
||
|
|
that inside of that folder you chamod the slack build script to be executable so that's chamod plus x
|
||
|
|
yes please dot slack build and then become root su into your root password and then run the script
|
||
|
|
dot slash yes please dot slack build and that finds this source package sitting next to it it
|
||
|
|
unzips it it moves it over into the temporary directory and builds it and compiles it and all
|
||
|
|
that other stuff that we've just written down in the script let's look and slash tmp and we'll
|
||
|
|
see our newly built yes please underscore august for twenty ten dot tgz well underscore x86 64 dash
|
||
|
|
one underscore sbo dot tgz and that is of course a normal everyday slack package that we could then
|
||
|
|
use install pkg to install onto our system and it it's simply unarchives that directory and takes
|
||
|
|
every all those little bits and pieces and dumps them into your file system where they belong and
|
||
|
|
spits out like a little description for you and stuff like that and it is truly as simple as that
|
||
|
|
the really cool thing is that if you ever want to look and see what has been installed on your
|
||
|
|
system in the lifespan of your slackware system you can simply do a ls on slash vars slash log
|
||
|
|
slash packages and there they are all the packages that you've ever installed now those aren't
|
||
|
|
the they don't contain the binaries and everything you know there's no reason to keep that stuff
|
||
|
|
around but they they do have it is a list of of everything that was installed and those each of
|
||
|
|
those packages contains a file list of everything that was installed and that's not just for your
|
||
|
|
information of course because if you ever went to go do a remove pkg then the system could look
|
||
|
|
at the file with all of the little folders and directories that it lists as having been part of
|
||
|
|
that install and it can see if they're unique you know make sure that they're not being used by any
|
||
|
|
other package on your system and if they are unique then it will remove that file from your system
|
||
|
|
and that's how remove pkg works so the install pkg takes your slack build and overlays it over your
|
||
|
|
your file system and records exactly what it has done in a plain text file in your slash vars slash
|
||
|
|
log slash packages and the remove pkg caps that log file and does a unique or sort with unique
|
||
|
|
flag probably over everything else figures out what it can and cannot remove and then removes it
|
||
|
|
and you're done it's that simple it's that generic notice how there's no complex packaging front
|
||
|
|
end there's no database underlying all of this it's just shell scripts plain text traditional
|
||
|
|
unix commands very very very cool and it's easy enough that someone like me and you dear listener
|
||
|
|
can actually start with on your own you know I mean if you know how to shell script you you
|
||
|
|
basically know how to make a slack build slack slack builds that that format that that packaging
|
||
|
|
format is the one I mean that is what is used by pat vulcarding to make slackware so it's a very
|
||
|
|
it's all very cohesive and very tried and tested so very robust little packaging format very simple
|
||
|
|
and I think once you do it or even once you've listened along to me doing that it does help you
|
||
|
|
understand what's going on during packaging because while this is very well I keep saying it's
|
||
|
|
non-specific but this is something that slackware does it's it's it's all the same idea it's
|
||
|
|
it's packaging so when we do rpm on the next episode a lot of that is going to sound very
|
||
|
|
familiar to this one and I do hope that you'll return for that episode on rpms but for now I
|
||
|
|
think we're finished with slack building I hope you enjoyed this I know it's been a long episode
|
||
|
|
hope it's been informative thanks for listening
|
||
|
|
you have been listening to hegerpublic radio at hegerpublicradio.org we are a community podcast
|
||
|
|
network that releases shows every weekday on day through friday today's show like all our shows
|
||
|
|
was contributed by an hbr listener like yourself if you ever consider recording a podcast
|
||
|
|
then visit our website to find out how easy it really is hegerpublic radio was founded by the
|
||
|
|
digital dot-pound and the infonomicum computer club hbr is funded by the binary revolution
|
||
|
|
at binref.com all binref projects are crowd-sponsored by linear pages from shared hosting to custom
|
||
|
|
private clouds go to lunar pages.com for all your hosting needs unless otherwise stasis today's
|
||
|
|
show is released on the creative commons at review show share a live video's own license
|