[swift-evolution] OS/Environment check in Swift
Muhammad Mominul Huque
mominul2082 at gmail.com
Fri Aug 19 07:27:38 CDT 2016
Hi,
We all know that we are lacking an environment check in Swift. It
shouldn't be a important feature if we were only targeting Apple(macOS,
iOS...) and Linux or if we are targeting only one Windows ABI. But our
community are working hard to port swift to Windows targeting various
ABIs. There are currently three main variants of Windows ABIs: MSVC,
Cygwin and MinGW. Of course, their ABI's varies too. So when porting
Swift to windows with targeting these ABIs and when writing swift code
on windows, we need an environment check .
By using the `environment check` term we are talking about the mechanism
that will provide us the information about the ABI that the swift
compiler is targeting.
When porting stdlib and Foundation to windows, community members are
using the method 'ad hoc -D flag'. But to me and to the community this
method is not sufficient or a long term solution. Saleem Abdulrasool and
Han Sangjin have pointed out this in following threads:
1.
https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20160704/002360.html
2.
https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160502/016381.html
But unfortunately the core team haven't succeeded to make or choose a
solution. But as we are expecting a swift release, we should make a
solution.
As Saleem pointed out that there are ABI problems in Linux also:
> This is not a problem strictly limited to Windows. It also appears in
> other OSes. As a concrete example, Linux has traditionally had the "gnu"
> environment (libc). However, there is also "uclibc" which is pretty
> common, and these days, "musl" as different targets.
So we have multiple environment(ABI?) in Linux also.
I have seen some core members want to know how other languages handles
this issue like Chris Lattner wanted to know:
> I am not a windows guru (and haven’t used it for over a decade) but
my understanding is that Cygwin is a different target (as in different
target triple, different ABI, different environment) from MSVC and
MinGW. If that is the case, it should be its own “arch” or “os”. MSVC
and MinGW (again, AFAIK) use the same C ABI, and thus could be treated
as the same target.
> I think it would be defensible to treat MSVC/MinGW as an os(Windows)
but treat Cygwin as os(Cygwin).
>
> How do other languages handle this? What does dlang do, for example?
>
> -Chris
So I want to put some information how other languages handles this issue.
## D lang
https://dlang.org/spec/version.html#predefined-versions
On D, anyone can handle this by using `version()` block.
```
version(Cygwin)
{
// Environment is Windows Cygwin
} else {
// Not a Windows Cygwin environment
}
```
## Rust
On windows Rust supports two ABI's: MSVC and Mingw(gnu). On rust we can
check the environment by:
```
#[cfg(target_env = "msvc")]
// MSVC environment
#[cfg(target_env = "gnu")]
// Mingw environment
```
## Environment check & Swift
Here I want to propose some conditionals:
```
environment(MSVC)
environment(CYGWIN)
environment(MUSL)
// or
target(MSVC)
target(MUSL)
// or
os(Windows, target: MSVC)
os(Linux, target: MUSL)
// or
os(Windows, environment: MSVC)
os(Linux, environment: MUSL)
```
We can discuss about this topic and submit a proposal when everyone is
agreed to a decision. So lets start!
Thanks
Mominul
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160819/a2860620/attachment.html>
More information about the swift-evolution
mailing list