<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hi all,</div><div class=""><br class=""></div>I Agree with Saleem that this is a worthwhile discussion, and I think I agree with Jordan that word environment seems a little bit wrong to me.<div class=""><br class=""></div><div class="">Following the discussion, it feels to me like what we're really concerned about is libc and ABI. &nbsp;Most of the examples that Saleem gave seems to have that in common. &nbsp;Jordan's example about environment(simulator) feels like a more natural fit (i.e. using it as a way to talk about the physical/virtual environment). &nbsp;I think that libc(gnu), etc., would be perhaps workable, but doesn't express the differences in ABI for the Itanium example.</div><div class=""><br class=""></div><div class="">I do like Erica's contribution of the Evolution proposal from a bit ago. Adding libc to it with a combined check for arch should get is substantially there.</div><div class=""><br class=""></div><div class="">I know that I'm rambling bit; my thoughts on the subject are not fully formed. &nbsp;I haven't been bitten by this particular issue yet, so it's of academic interest so far.</div><div class=""><br class=""></div><div class="">Thanks to all for their work,</div><div class="">- Will</div><div class=""><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jul 7, 2016, at 7:19 PM, Jordan Rose &lt;<a href="mailto:jordan_rose@apple.com" class="">jordan_rose@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Thanks for sending this out, Saleem!</div><div class=""><br class=""></div><div class="">I’m not convinced that gnu/uclibc/musl are environment variants worth testing for, nor do I think we actually want to model Android as a kind of Linux. It’s unclear whether “environment” is another set of mutually-exclusive options (enum-like) or a way to check several things that might all be true (option-set-like). For example, is “itanium” really distinct from all the others, or can you have itanium-gnu?</div><div class=""><br class=""></div><div class="">I imagine some people might like to distinguish Linux distros as well, but since those follow the “<a href="https://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/" class="">like Gecko</a>” policy, I’m not sure we’d actually want to encourage people to use such a thing. On the other hand, we could easily have ‘environment(simulator)’ for the Apple device OSs.</div><div class=""><br class=""></div><div class=""><div class="">It’s also not clear whether we always want ‘environment' to be a subset of ‘os', i.e. it’s a mistake to test for “simulator” before checking for an OS because it might mean different things on different platforms. (iOS simulator or Android simulator?)</div></div><div class=""><br class=""></div><div class="">I’ll defer to all of you as to whether “gnu” and “cygnus” are the right names for MinGW and Cygwin. I kind of thought Cygnus was named as such because it was also a GNU environment.</div><div class=""><br class=""></div><div class="">A related use is something that’s <i class="">above</i>&nbsp;`os(…)`, so that we can have all the Apple platforms grouped together. That could be “environment”, or it could be something different.</div><div class=""><br class=""></div><div class="">Finally, in the spirit of “question everything”, is “environment” the right name for this setting? :-)</div><div class=""><br class=""></div><div class="">The goal of this thread should be for you/us to converge on a design, and then for someone to write it up and take to swift-evolution.</div><div class=""><br class=""></div><div class="">Jordan</div><div class=""><br class=""></div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jul 7, 2016, at 18:17, Saleem Abdulrasool &lt;<a href="mailto:compnerd@compnerd.org" class="">compnerd@compnerd.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi,<div class=""><br class=""></div><div class="">Id like to revive the discussion around OS "variants".&nbsp; I've been doing some work to bring up Windows without any emulation layer (MSVCRT based) as a viable host environment.&nbsp; This work is bringing to light the need for more finer grained OS checks.</div><div class=""><br class=""></div><div class="">Currently, we have the `os` compilation condition.&nbsp; However, this doesn't provide sufficiently detailed information for Windows.&nbsp; On Windows, we have at least 4 different "variants":</div><div class=""><br class=""></div><div class="">- "msvc" (Microsoft's environment)</div><div class="">- "itanium" (MS ABI for C, Itanium ABI for C++)</div><div class="">- "gnu" (MinGW)</div><div class="">- "cygnus" (cygwin)</div><div class=""><br class=""></div><div class="">Each one of these is slightly different and requires particular handling in the runtime.&nbsp; However, the OS for each one of these is windows, and so `os(Windows)` yields true on all of them.</div><div class=""><br class=""></div><div class="">This is not a problem strictly limited to Windows.&nbsp; It also appears in other OSes.&nbsp; As a concrete example, Linux has traditionally had the "gnu" environment (libc).&nbsp; However, there is also "uclibc" which is pretty common, and these days, "musl" as different targets.&nbsp; Swift also supports android, which is a Linux environment variant.<br class=""><br class="">As deeper system integration occurs with swift, the need for finer grained os detection logic is probably going to be needed.</div><div class=""><br class=""></div><div class="">To keep things simple, I would like to propose the "environment" conditional compilation directive.&nbsp; It would yield true for the appropriate environment with one of the previously mentioned values for windows and true for "android" on Android.&nbsp; It would sit as a peer to `os` and allow for finer grained querying of the host environment.</div><div class=""><br class=""></div><div class="">-- <br class=""><div data-smartmail="gmail_signature" class="">Saleem Abdulrasool<br class="">compnerd (at) compnerd (dot) org</div>
</div></div>
</div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></div></body></html>