> On 6 Nov 2016, at 06:57, Jack Howarth <howarth.at....@gmail.com> wrote:
> 
> On Sun, Nov 6, 2016 at 9:45 AM, Iain Sandoe <i...@codesourcery.com> wrote:
>> 
>>> On 6 Nov 2016, at 06:04, Jack Howarth <howarth.at....@gmail.com> wrote:
>>> 
>>> On Sun, Nov 6, 2016 at 8:36 AM, Jack Howarth <howarth.at....@gmail.com> 
>>> wrote:
>>>> The use of an Apple sandbox with denied file access permissions into 
>>>> /usr/local
>>>> exposed that cc1 fails on errors of...
>>>> 
>>>> cc1: error: /usr/local/include: Operation not permitted
>>>> 
>>>> The commonly suggested solution of using --with-local-prefix= set to 
>>>> something
>>>> other than /usr/local is undeirable on darwin because that creates a 
>>>> compiler
>>>> which retains library searches in /usr/local/lib despite no longer 
>>>> searching
>>>> for headers in /usr/local/include (which makes it suspicable to 
>>>> header/library
>>>> mismatches during builds).
>>>> 
>>>> The following trivial fix solves the issue by silently ignoring errors from
>>>> denied permissions as well as non-existent dirs from the stat (cur->name, 
>>>> &st)
>>>> call in remove_dup() of gcc/incpath.c. Okay for gcc trunk and backports to
>>>> gcc-5-branch and gcc-6-branch?
>>>>                  Jack Howarth
>>> 
>>>   Perhaps it would be useful if I expounded a bit on the
>>> complexities that this
>>> PR introduces on darwin. Both MacPorts and now fink leverage the Apple 
>>> sandbox
>>> to avoid contaminating their builds with development files installed
>>> in /usr/local.
>>> However the FSF gcc compiler packages built still should allow end-users to
>>> build against /usr/local as normal outside of the packaging systems. On 
>>> darwin,
>>> it has been suggested that the sandbox build issues of FSF gcc be addressed 
>>> by
>>> using ---sysroot instead. Unfortunately that approach in not viable because 
>>> the
>>> Xcode developers no longer bundle the SDK of the prior OS in Xcode.app once
>>> a new OS is released. Thus using the SDK installed at / is the only
>>> option (since
>>> building against the next OS SDK on the prior OS is unsupported on darwin),
>>> and this nullifies the ability to use --sysroot to work around this issue.
>>> 
>>> I believe the proposed patch is a trivial and straightforward solution
>>> which allows
>>> darwin developers to package the FSF gcc compilers within an Apple sandbox
>>> while retaining the ability of the built compilers to behave as expect
>>> with regard
>>> to /usr/local outside of the Apple sandbox.
>> 
>> a. The patch seems reasonable on one level (if you don’t have permission to 
>> read the directory, then there’s no point in adding it to the search path).
>> 
>> b. However, ISTM that your configuration process should be pointing the 
>> compiler to a usable sysroot [which contains only directories to which the 
>> toolchain has suitable permissions].
>> 
>> c. It is clear that the situation is complex (for Darwin), we want users to 
>> be able to use either the xcode-provided sdk as the sysroot or an 
>> installation of the ‘command line tools’ (which effectively provides a 
>> sysroot in ‘/‘).
>> 
>> d.  One day we might be able to build enough of the sysroot to support the 
>> compiler without needing this (but we’re not there yet).
>> 
>> We cannot [AFAIU, INAL etc.] take the option of packaging the sysroot 
>> ourselves until (d) is achieved.
>> 
>> ===
>> 
>> So… I’m not sure we have a good way of achieving this completely 
>> automatically, in a user-transparent manner (yet) …  however, one way of 
>> achieving this in a not-to-painful manner, is to have a toolchain layout like
>> 
>> bin/
>> lib/
>> SDKs/
>>   native => symlink to either the XCode sysroot - or ‘/‘.
>> 
>> and to configure gcc  “—with-sysroot=<prefix>/SDKs/native”
> 
> One can no longer safely assume that any place other than / has the
> appropriate development SDK for open source software on darwin. As
> Jeremy Huddleston Sequoia recently described the situation to me...
> 
> "Yeah, most OSS projects assume that the buildtime headers and
> libraries match the minimum deployment target.  They decide that if
> configure determines that openat(2) is available at build time, it can
> be unconditionally used by the program.
> 
> The Apple model is that the SDK contains availability markup that
> allows developers to specify older OS versions as a deployment target.
> Newer symbols get weakly bound, and developers need to check for their
> existence before usage.
> 
> Simply picking the 10.12 SDK when the developer/user has asked for the
> system-matched SDK is going to result in problems, as we've repeatedly
> seen when users try to build against the +1 SDK with software that
> doesn't know how to handle that properly."
> 
> You really can't safely depend on the Apple Xcode.app SDK any more.
> You will be okay one day and if you update your Xcode.app, will be
> broken (i.e. building against the wrong SDK) the next day.
> 
>> 
>> The end user would then need to amend/make the symlink to point to “/" or 
>> the xcode SDK at installation time.
>> 
>> Alternately, you could default it to “/“ if you believe that the end users 
>> are mostly going to be using the “command line tools” installtion - or you 
>> could make your installation script discover Xcode’s SDK and point to that 
>> if you believe that most users will have Xcode installed,
>> 
>> If you simply want “/“ to be the runtime-default sysroot, then
>> —with-sysroot=/ --with-build-sysroot=/path/to/build/time/sysroot
>> should work, and if it doesn’t we should fix the configury machinery so that 
>> it does.
> 
> I don't see how this can possibly work short of the user actually
> running some form of chroot on darwin and substituting a fake local
> /usr/local there that is empty. Too many levels of complexity compared
> to this trivial patch that resolves the conflict between FSF gcc and
> Apple sandboxing.

there’s not really any substitute for supplying a suitable build-time sysroot 
for the intended host (and a suitable -mmacosx-version-min=).  All Darwin 
toolchains are intended to be cross-toolchains for any version of same-arch 
Darwin; again, providing the right pair of SDK and —mmacosx-version-min= are 
supplied.

If you provide the right inputs, then nothing should be escaping from the 
sandbox, at build time, right?
(if that doesn’t / can’t work then we need to figure out how to make it work, 
since the build layout should match the expected deployment).

I agree that XCode N+1 can break assumptions; so control the used 
SDK/mmacosx-version-min to be the correct one for the target system (AFAIR, 
xcode itself always appends -isysroot and so does clang, and xcode provides a 
selection for the SDK to be used).

FWIW, assuming that  “/“ is “always right" not likely going to work completely 
either (w.r.t headers) - since the end user can change the “command line tools” 
version on a pull-down menu in xcode.  however, it’s agreed that  / should 
always contain at least one set of usable runtimes.

Anyway, I have no further comments on this patch.
Iain

Reply via email to