You know, this is a really short chapter.
And it’s the last chapter of Part II.
And the last five posts have taken multiple days to write, and have all come out far too long for any human to reasonably read.
And the mess that was cross-compilation left me kind of drained, and not very excited to keep reading.
So I’m gonna take it easy this time.
Chapter 10. Platform Notes
The only platform mentioned here is Darwin. Which happens to be my platform. So I hope to learn a thing or two.
Okay, we use clang
here, not gcc.
And it’s great, by the way. The first time I saw an error message from clang
… truly eye-opening. I feel like the bar for acceptable compiler error messages is a lot higher than it was ten years ago. How much of that is thanks to clang
? I do not know.
On Darwin, libraries are linked using absolute paths, libraries are resolved by their
install_name
at link time.
I realize I am grammatically pretty picky but this is really a case where a semicolon would improve the legibility of that sentence. I had to read it a couple times.
Sometimes packages won’t set this correctly causing the library lookups to fail at runtime. This can be fixed by adding extra linker flags or by running
install_name_tool -id
during thefixupPhase
.
I don’t know what install_name
is. I google it, and am sort of confused. It seems that it’s a property of a .dylib
file? That tells you how to refer to said file? But… if you are looking at the .dylib
file… you must have referred to it already. It seems to also be a format for specifying paths to .dylib
s relative to RPATH
or the current executable or whatever. But that doesn’t seem to be the usage here.
Hmm. I guess this is… some sort of safety precaution? That you can only refer to the .dylib
in the precise way that the .dylib
wants you to refer to it? No; that’s insane. I have no idea what this is. I will learn more if I ever have to.
There’s another weird note about dynamic linking, where tests might fail because the checkPhase
is run before the installPhase
– the implication being that the installPhase
sets the install_name
. So I can either run tests after install or set DYLD_LIBRARY_PATH
. Okay.
Lastly, anything that uses xcrun
in its build steps need to actually use cc
directly. Or if it actually uses a .xcodeproj
, use the xcbuild
package:
$ sd nix info xcbuild
xcodebuild-0.1.2-pre Xcode-compatible build tool
Neat. Alright. That’s it!
We’re done. A short chapter, to cap off a very long “part.” And the first bite-sized blog post in three weeks. Feels good, you know?
- Why is
install_name
an intrinsic property of a.dylib
file?