Touch complicated, hope I explained it clearly. Probably best not to read at 
half-time today :> Watch J-Lo instead...


After a number of years at @274,  ld6 @450 can now build with MacPorts. It 
matches Xcode 10.2.  ld64 @450 supports the latest TAPI-requiring SDKs, new 
features, etc, and all our Intel systems (10.6+ at least) would do well to move 
to that version.

The WIP is here, and seems pretty close to done, and does pretty well on the 
test suite, other than a bootstrapping issue I'm outlining with this question:

<https://github.com/macports/macports-ports/pull/6262>

I would appreciate any potential testers to exercise this port prior to us 
committing it, if there are any interested users out there.


There has been a bootstrapping issue with ld64 for years, but until now it only 
involved 10.6.8, and so was not fixed to date. Now it will involve < 10.12, so 
we should look at it. The essence is:


1. ld64 > 274 requires libtapi. 
2. libtapi uses c++17 features, so only builds with Xcode clangs > 802 ( ie 
Xcode 9) and macports-clang > 5.0. This does not appear immediately simple to 
downgrade.
3. This means all systems < 10.12 will have to build libtapi with a 
macports-clang version. 
4. But macports-clang-* requires ld64 as a runtime dependency (it's hardcoded 
into the compiler to search for it in ${prefix}/bin/ld ). (NB this does not 
have to be ld64-latest.)
5. Ergo circular dependency.


ld64 uses variants to select the last version your toolchain can build   
(10.4=97, 10.5 and 10.6=127, 10.7 to 10.11 will be =274 due to libtapi, 10.12 
and up=450). -- and the "ld64-latest" version is the one you get with no 
variants enabled. This works, but doesn't lend itself easily to an automated 
bootstrap, and requires a manual step.

ie to get the latest ld64 on a given system, you would need to do what 10.6.8 
does now (NB adding in the new ld64_274 variant).

sudo port -v install ld64
sudo port -v -n upgrade --enforce-variants ld64 -ld64_97 -ld64_127  -ld64_236 
-ld64_274 -ld64_xcode

So, not bootstrap-friendly... if we want to automate getting all systems onto 
ld64-latest, we'll need to come up with something.


Possible Solution:

We could make a new port, ld64-bootstrap, that symlinks in the last ld64 that 
the users Xcode toolchain can build.

Then change the runtime ld64 dependency in the clang ports (and the gcc ports 
as well, I guess) to a path dependency so that ld64-bootstrap would satisfy it:

depends_run-append path:bin/ld:ld64

the ld64 port would depend on ld64-bootstrap.

That's all pretty easy.


The issue seems to be getting ld64-bootstrap to be preferentially installed if 
"${prefix}/bin/ld"  does not exist, and then getting ld64 to replace it if 
"${prefix}/bin/ld" does exist.

I am not sure how to go about doing that at present.

Ideas welcome.

Ken



PS - anticipating the libtapi issue, I have left it possible to build libtapi 
with gcc against ${prefix}/lib/libgcc which avoids this, but this has potential 
stdlib issues of course. And still doesn't fix 10.6.8.






Reply via email to