Okay did I mention how I sucked at the command line? This is part of the journey towards stopping. Yes, I’m on a Mac and it’s not very *nix-y in some ways but it’s enough for me for now.
Today’s story starts when I learned about gdb
, the pure-command-line GNU Debugger, which is incredibly cool. I have tried and failed to learn how to use the debug function on many of my IDEs; I found shotgunning printf
statements as needed faster. This may well be the first time I found a command-line tool so much more intuitive than the GUI-equipped programs. Wow.
Then I learned that for some reason the gdb
on this computer was 6.3, which is 1.2~1.5 major versions behind (depending on how you count) and missing a frustrating amount of features. (The one that the current Code::Blocks installer installs is also something like 6.4. Blech.)
Okay, great. Well, I can download gdb
… I can change to the right directory and type make
, even though I don’t think I’ve ever done so without being destroyed by weird dependencies… I can wait through the resulting explosion of unreadable computer-y text (this would be a lot more authentic background image for the news on “hackers” compared to whatever they’re showing)… I can make install
which will, as the readme file says, install by default into /usr/bin/local
…
Hmm, permission denied? That’s right, I need to sudo make install
! I have just blown myself away with my expertise.
Darn, gdb --version
still gives me 6.4.
Lesson number two: Mac OS X has this really complicated routine for deciding what your $PATH
environment variable is, which is from what I know just where the computer looks for each program name (e.g. gdb
) you attempt to run. The list appears to be:
/etc/paths
, text file with one directory per line/etc/manpaths
, ditto above/etc/paths.d/
, directory with text files, parsed alphabetically, that work as above/etc/manpaths.d/
, directory … ditto above~/.bashrc
, shell script with lots of commands if it does something likeexport PATH
~/.bash_profile
, ditto under some confusing conditions~/.bash_login
, ditto~/.profile
, ditto
(This is my source and I’m going to scream if you ask me what feline species that version corresponds to because it’s too much and it probably doesn’t matter)
Now. The fundamental Mac default $PATH
(which you can see by viewing /etc/paths
) puts /usr/bin
before /usr/local/bin
, which is why my first make install
didn’t change the version. So, question: why?
I figured it out from Unix Mages, which has this ebook full of stuff that was mostly explained by all the *nix tutorials ever except for this part about the directory structure of the whole system around page 40. The book uses a thoroughly-extended but perfectly apt metaphor (we call it a “conceit” in literature class) comparing the command-line to magic. Anyway, the important bit is:
At the top oflocal
, we, once again, see rooms [folders] with the same names [stuff likebin
,etc
,lib
,sbin
] as the first and second floors [/
and/usr/
]. Thelocal
rooms are usually customized for the Tower [computer system] itself – the archmages [people who don’t suck at the command line] can create whatever they want here. It’s an unwritten mage rule that says you should try to keep your Towers [sic] first two floors similar, but you can use the third floor however you want. So don’t be surprised if you ever visit another Tower and see that the third floor looks completely different!
So logically /usr/local/bin
should indeed take precedence since the user installs stuff there instead of it being more-or-less built-in, and searching says it does on other *nix systems. The answer to “why?” is “I don’t know, but I think Apple did something dumb.”
Well, you can sudo
(favorite editor) /etc/paths
to move it if you’re brave, but the safe solution is apparently just throwing
PATH=/usr/local/bin:$PATH
export PATH
or combining it with whatever’s in whichever of items 5 to 8 above you’re using. I’m going to gently suggest .profile
because it’s the only file I have that exists and some automated Python thing I did a while ago added something there. There’s a difference related to whether the shell is a login shell that I haven’t figured out yet.
Still clueless, but at least I have the debugging skip
command working now.
Why all this now? Tomorrow is the local informatics competition which I got into somehow, and it appears they want us to bring our own programming software on a USB, which is… weird. I half-expect that we don’t actually need to do it, but I brought a copy of Vim, the basic MinGW library, and one of every version of installer of Dev-C++ and Code::Blocks I could find. Serendipitously, it means I get to postpone two of my midterms. Well, we’ll see what happens.