Skip to content

Commit 95179d3

Browse files
committed
Add Fuchsia OS Support
Adds Fuchsia target support to the compiler and builds the stdlib for Fuchsia.
1 parent 7555aff commit 95179d3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+318
-52
lines changed

CMakeLists.txt

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ set(SWIFT_ANDROID_DEPLOY_DEVICE_PATH "" CACHE STRING
184184
# User-configurable ICU specific options for Android, FreeBSD, Linux and Haiku.
185185
#
186186

187-
foreach(sdk ANDROID;FREEBSD;LINUX;WINDOWS;HAIKU)
187+
foreach(sdk ANDROID;FREEBSD;LINUX;WINDOWS;FUCHSIA;HAIKU)
188188
set(SWIFT_${sdk}_ICU_UC "" CACHE STRING
189189
"Path to a directory containing the icuuc library for ${sdk}")
190190
set(SWIFT_${sdk}_ICU_UC_INCLUDE "" CACHE STRING
@@ -736,10 +736,10 @@ if(swift_build_android AND NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
736736

737737
set(SWIFT_ANDROID_PREBUILT_PATH
738738
"${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_suffix}")
739-
739+
740740
# Resolve the correct linker based on the file name of CMAKE_LINKER (being 'ld' or 'ld.gold' the options)
741741
get_filename_component(SWIFT_ANDROID_LINKER_NAME "${CMAKE_LINKER}" NAME)
742-
set(SWIFT_SDK_ANDROID_ARCH_armv7_LINKER
742+
set(SWIFT_SDK_ANDROID_ARCH_armv7_LINKER
743743
"${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_suffix}/bin/arm-linux-androideabi-${SWIFT_ANDROID_LINKER_NAME}")
744744

745745
configure_sdk_unix(ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi" "${SWIFT_ANDROID_SDK_PATH}")
@@ -753,6 +753,27 @@ if(swift_build_android AND NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
753753
endif()
754754
endif()
755755

756+
# Should we cross-compile the standard library for Fuchsia
757+
is_sdk_requested(FUCHSIA swift_build_fuchsia)
758+
if(swift_build_fuchsia AND NOT "${SWIFT_FUCHSIA_BUILD_PATH}" STREQUAL "")
759+
# HACK: support arm64 fuchsia builds
760+
set(SWIFT_FUCHSIA_SYSROOT
761+
"${SWIFT_FUCHSIA_BUILD_PATH}/out/build-zircon/build-zircon-pc-x86-64/sysroot")
762+
763+
set(SWIFT_SDK_FUCHSIA_ARCH_x86_64_LINKER
764+
"${SWIFT_FUCHSIA_BUILD_PATH}/buildtools/linux-x64/clang/bin/ld.lld")
765+
766+
configure_sdk_unix(FUCHSIA "Fuchsia" "fuchsia" "fuchsia" "x86_64" "x86_64-unknown-fuchsia" "${SWIFT_FUCHSIA_SYSROOT}")
767+
768+
if (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux"))
769+
message(FATAL_ERROR "A Darwin or Linux host is required to build the Swift runtime for Fuchsia")
770+
elseif(("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND NOT swift_build_osx) OR
771+
("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND NOT swift_build_linux))
772+
set(SWIFT_PRIMARY_VARIANT_SDK_default "FUCHSIA")
773+
set(SWIFT_PRIMARY_VARIANT_ARCH_default "x86_64")
774+
endif()
775+
endif()
776+
756777
# Should we cross-compile the standard library for Windows?
757778
is_sdk_requested(WINDOWS swift_build_windows)
758779
if(swift_build_windows AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")

cmake/modules/AddSwift.cmake

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ function(_add_variant_c_compile_link_flags)
119119
"-B" "${SWIFT_ANDROID_PREBUILT_PATH}/arm-linux-androideabi/bin/")
120120
endif()
121121

122+
if("${CFLAGS_SDK}" STREQUAL "FUCHSIA")
123+
list(APPEND result
124+
"-I${SWIFT_FUCHSIA_BUILD_PATH}/buildtools/linux-x64/clang/lib/x86_64-fuchsia/include/c++/v1/"
125+
"-L${SWIFT_FUCHSIA_BUILD_PATH}/buildtools/linux-x64/clang/lib/x86_64-fuchsia/lib")
126+
endif()
127+
122128
if(IS_DARWIN)
123129
# Check if there's a specific OS deployment version needed for this invocation
124130
if("${CFLAGS_SDK}" STREQUAL "OSX")
@@ -270,6 +276,13 @@ function(_add_variant_c_compile_flags)
270276
"-I${SWIFT_ANDROID_NDK_PATH}/sources/android/support/include")
271277
endif()
272278

279+
if("${CFLAGS_SDK}" STREQUAL "FUCHSIA")
280+
list(APPEND result
281+
"-mcx16"
282+
"-I${SWIFT_FUCHSIA_BUILD_PATH}/third_party/icu/source/common/"
283+
"-I${SWIFT_FUCHSIA_BUILD_PATH}/third_party/icu/source/i18n/")
284+
endif()
285+
273286
set("${CFLAGS_RESULT_VAR_NAME}" "${result}" PARENT_SCOPE)
274287
endfunction()
275288

@@ -369,6 +382,8 @@ function(_add_variant_link_flags)
369382
list(APPEND library_search_directories
370383
"${SWIFT_ANDROID_PREBUILT_PATH}/arm-linux-androideabi/lib/armv7-a"
371384
"${SWIFT_ANDROID_PREBUILT_PATH}/lib/gcc/arm-linux-androideabi/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
385+
elseif("${LFLAGS_SDK}" STREQUAL "FUCHSIA")
386+
list(APPEND result "-lc" "-ldl")
372387
else()
373388
# If lto is enabled, we need to add the object path flag so that the LTO code
374389
# generator leaves the intermediate object file in a place where it will not
@@ -1290,6 +1305,9 @@ endfunction()
12901305
# SWIFT_MODULE_DEPENDS_CYGWIN
12911306
# Swift modules this library depends on when built for Cygwin.
12921307
#
1308+
# SWIFT_MODULE_DEPENDS_FUCHSIA
1309+
# Swift modules this library depends on when built for Fuchsia.
1310+
#
12931311
# SWIFT_MODULE_DEPENDS_HAIKU
12941312
# Swift modules this library depends on when built for Haiku.
12951313
#
@@ -1397,7 +1415,7 @@ function(add_swift_library name)
13971415
if("${SWIFTLIB_TARGET_SDKS}" STREQUAL "")
13981416
set(SWIFTLIB_TARGET_SDKS ${SWIFT_SDKS})
13991417
endif()
1400-
list_replace(SWIFTLIB_TARGET_SDKS ALL_POSIX_PLATFORMS "ALL_APPLE_PLATFORMS;ANDROID;CYGWIN;FREEBSD;LINUX;HAIKU")
1418+
list_replace(SWIFTLIB_TARGET_SDKS ALL_POSIX_PLATFORMS "ALL_APPLE_PLATFORMS;ANDROID;CYGWIN;FREEBSD;LINUX;FUCHSIA;HAIKU")
14011419
list_replace(SWIFTLIB_TARGET_SDKS ALL_APPLE_PLATFORMS "${SWIFT_APPLE_PLATFORMS}")
14021420

14031421
# All Swift code depends on the standard library, except for the standard
@@ -1509,6 +1527,9 @@ function(add_swift_library name)
15091527
elseif("${sdk}" STREQUAL "CYGWIN")
15101528
list(APPEND swiftlib_module_depends_flattened
15111529
${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN})
1530+
elseif("${sdk}" STREQUAL "FUCHSIA")
1531+
list(APPEND swiftlib_module_depends_flattened
1532+
${SWIFTLIB_SWIFT_MODULE_DEPENDS_FUCHSIA})
15121533
elseif("${sdk}" STREQUAL "HAIKU")
15131534
list(APPEND swiftlib_module_depends_flattened
15141535
${SWIFTLIB_SWIFT_MODULE_DEPENDS_HAIKU})
@@ -2027,8 +2048,7 @@ function(_add_swift_executable_single name)
20272048

20282049
add_dependencies_multiple_targets(
20292050
TARGETS "${name}"
2030-
DEPENDS
2031-
${dependency_target}
2051+
DEPENDS ${dependency_target}
20322052
${LLVM_COMMON_DEPENDS}
20332053
${SWIFTEXE_SINGLE_DEPENDS}
20342054
${SWIFTEXE_SINGLE_LINK_FAT_LIBRARIES_TARGETS})

include/swift/Basic/LangOptions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,8 @@ namespace swift {
271271
Target.getOSVersion(major, minor, revision);
272272
} else if (Target.isOSLinux() || Target.isOSFreeBSD() ||
273273
Target.isAndroid() || Target.isOSWindows() ||
274-
Target.isPS4() || Target.isOSHaiku() ||
275-
Target.getTriple().empty()) {
274+
Target.isPS4() || Target.isOSFuchsia() ||
275+
Target.isOSHaiku() || Target.getTriple().empty()) {
276276
major = minor = revision = 0;
277277
} else {
278278
llvm_unreachable("Unsupported target OS");

include/swift/Runtime/Concurrent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <atomic>
1616
#include <functional>
1717
#include <stdint.h>
18+
#include <cstdio>
1819
#include "llvm/Support/Allocator.h"
1920

2021
#if defined(__FreeBSD__) || defined(__CYGWIN__) || defined(__HAIKU__)

include/swift/Runtime/Mutex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
#include <type_traits>
2222

23-
#if (defined(__APPLE__) || defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__HAIKU__))
23+
#if (defined(__APPLE__) || defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__) || defined(__Fuchsia__) || defined(__HAIKU__))
2424
#include "swift/Runtime/MutexPThread.h"
2525
#elif defined(_WIN32)
2626
#include "swift/Runtime/MutexWin32.h"

lib/Basic/LangOptions.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ static const StringRef SupportedConditionalCompilationOSs[] = {
3737
"Android",
3838
"PS4",
3939
"Cygwin",
40+
"Fuchsia",
4041
"Haiku",
4142
};
4243

@@ -182,6 +183,8 @@ std::pair<bool, bool> LangOptions::setTarget(llvm::Triple triple) {
182183
addPlatformConditionValue(PlatformConditionKind::OS, "Cygwin");
183184
else if (triple.isPS4())
184185
addPlatformConditionValue(PlatformConditionKind::OS, "PS4");
186+
else if (triple.isOSFuchsia())
187+
addPlatformConditionValue(PlatformConditionKind::OS, "Fuchsia");
185188
else if (triple.isOSHaiku())
186189
addPlatformConditionValue(PlatformConditionKind::OS, "Haiku");
187190
else

lib/Basic/Platform.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) {
9191
case llvm::Triple::Ananas:
9292
case llvm::Triple::CloudABI:
9393
case llvm::Triple::DragonFly:
94-
case llvm::Triple::Fuchsia:
9594
case llvm::Triple::KFreeBSD:
9695
case llvm::Triple::Lv2:
9796
case llvm::Triple::NetBSD:
@@ -134,6 +133,8 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) {
134133
}
135134
case llvm::Triple::PS4:
136135
return "ps4";
136+
case llvm::Triple::Fuchsia:
137+
return "fuchsia";
137138
case llvm::Triple::Haiku:
138139
return "haiku";
139140
}

lib/Driver/Driver.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,9 @@ makeToolChain(Driver &driver, const llvm::Triple &target) {
224224
case llvm::Triple::Win32:
225225
return llvm::make_unique<toolchains::Cygwin>(driver, target);
226226
break;
227+
case llvm::Triple::Fuchsia:
228+
return llvm::make_unique<toolchains::Fuchsia>(driver, target);
229+
break;
227230
case llvm::Triple::Haiku:
228231
return llvm::make_unique<toolchains::GenericUnix>(driver, target);
229232
break;

lib/Driver/ToolChains.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,6 +1803,14 @@ bool toolchains::Android::shouldProvideRPathToLinker() const {
18031803
return false;
18041804
}
18051805

1806+
std::string toolchains::Fuchsia::getDefaultLinker() const {
1807+
return "lld";
1808+
}
1809+
1810+
bool toolchains::Fuchsia::shouldProvideRPathToLinker() const {
1811+
return false;
1812+
}
1813+
18061814
std::string toolchains::Cygwin::getDefaultLinker() const {
18071815
// Cygwin uses the default BFD linker, even on ARM.
18081816
return "";

lib/Driver/ToolChains.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,16 @@ class LLVM_LIBRARY_VISIBILITY Android : public GenericUnix {
111111
~Android() = default;
112112
};
113113

114+
class LLVM_LIBRARY_VISIBILITY Fuchsia : public GenericUnix {
115+
protected:
116+
std::string getDefaultLinker() const override;
117+
118+
bool shouldProvideRPathToLinker() const override;
119+
public:
120+
Fuchsia(const Driver &D, const llvm::Triple &Triple) : GenericUnix(D, Triple) {}
121+
~Fuchsia() = default;
122+
};
123+
114124
class LLVM_LIBRARY_VISIBILITY Cygwin : public GenericUnix {
115125
protected:
116126
std::string getDefaultLinker() const override;

stdlib/private/StdlibUnittest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ add_swift_library(swiftStdlibUnittest ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STD
4141
SWIFT_MODULE_DEPENDS_LINUX Glibc
4242
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
4343
SWIFT_MODULE_DEPENDS_CYGWIN Glibc
44+
SWIFT_MODULE_DEPENDS_FUCHSIA Glibc
4445
SWIFT_MODULE_DEPENDS_HAIKU Glibc
4546
SWIFT_COMPILE_FLAGS ${swift_stdlib_unittest_compile_flags}
4647
TARGET_SDKS ALL_POSIX_PLATFORMS

stdlib/private/StdlibUnittest/RaceTest.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import SwiftPrivateLibcExtras
4141
import SwiftPrivatePthreadExtras
4242
#if os(OSX) || os(iOS)
4343
import Darwin
44-
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Haiku)
44+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Fuchsia) || os(Haiku)
4545
import Glibc
4646
#endif
4747

stdlib/private/StdlibUnittest/StdlibCoreExtras.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import SwiftPrivate
1414
import SwiftPrivateLibcExtras
1515
#if os(OSX) || os(iOS)
1616
import Darwin
17-
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Haiku)
17+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Fuchsia) || os(Haiku)
1818
import Glibc
1919
#endif
2020

stdlib/private/StdlibUnittest/StdlibUnittest.swift.gyb

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import SwiftPrivateLibcExtras
2020

2121
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
2222
import Darwin
23-
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Haiku)
23+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Fuchsia) || os(Haiku)
2424
import Glibc
2525
#endif
2626

@@ -1432,6 +1432,7 @@ public enum OSVersion : CustomStringConvertible {
14321432
case ps4
14331433
case windowsCygnus
14341434
case windows
1435+
case fuchsia
14351436
case haiku
14361437

14371438
public var description: String {
@@ -1462,6 +1463,8 @@ public enum OSVersion : CustomStringConvertible {
14621463
return "Cygwin"
14631464
case .windows:
14641465
return "Windows"
1466+
case .fuchsia:
1467+
return "Fuchsia"
14651468
case .haiku:
14661469
return "Haiku"
14671470
}
@@ -1506,6 +1509,8 @@ func _getOSVersion() -> OSVersion {
15061509
return .windowsCygnus
15071510
#elseif os(Windows)
15081511
return .windows
1512+
#elseif os(Fuchsia)
1513+
return .fuchsia
15091514
#elseif os(Haiku)
15101515
return .haiku
15111516
#else
@@ -1589,7 +1594,9 @@ public enum TestRunPredicate : CustomStringConvertible {
15891594
case windowsAny(reason: String)
15901595

15911596
case windowsCygnusAny(reason: String)
1592-
1597+
1598+
case fuchsiaAny(reason: String)
1599+
15931600
case haikuAny(reason: String)
15941601

15951602
case objCRuntime(/*reason:*/ String)
@@ -1683,7 +1690,10 @@ public enum TestRunPredicate : CustomStringConvertible {
16831690

16841691
case .windowsCygnusAny(reason: let reason):
16851692
return "windowsCygnusAny(*, reason: \(reason))"
1686-
1693+
1694+
case .fuchsiaAny(reason: let reason):
1695+
return "fuchsiaAny(*, reason: \(reason))"
1696+
16871697
case .haikuAny(reason: let reason):
16881698
return "haikuAny(*, reason: \(reason))"
16891699

@@ -1969,7 +1979,15 @@ public enum TestRunPredicate : CustomStringConvertible {
19691979
default:
19701980
return false
19711981
}
1972-
1982+
1983+
case .fuchsiaAny:
1984+
switch _getRunningOSVersion() {
1985+
case .fuchsia:
1986+
return true
1987+
default:
1988+
return false
1989+
}
1990+
19731991
case .haikuAny:
19741992
switch _getRunningOSVersion() {
19751993
case .haiku:

stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ add_swift_library(swiftSwiftPrivateLibcExtras ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES
1414
SWIFT_MODULE_DEPENDS_LINUX Glibc
1515
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
1616
SWIFT_MODULE_DEPENDS_CYGWIN Glibc
17+
SWIFT_MODULE_DEPENDS_FUCHSIA Glibc
1718
SWIFT_MODULE_DEPENDS_HAIKU Glibc
1819
INSTALL_IN_COMPONENT stdlib-experimental)

stdlib/private/SwiftPrivateLibcExtras/Subprocess.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
// posix_spawn is not available on Android or Windows (MSVC).
14-
#if !defined(__ANDROID__) && !defined(__HAIKU__) && (!defined(_WIN32) || defined(__CYGWIN__))
14+
#if !defined(__ANDROID__) && !defined(__Fuchsia__) && !defined(__HAIKU__) && (!defined(_WIN32) || defined(__CYGWIN__))
1515

1616
#include "swift/Runtime/Config.h"
1717

stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@
1313
import SwiftPrivate
1414
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
1515
import Darwin
16-
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Haiku)
16+
#elseif os(Linux) || os(FreeBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Fuchsia) || os(Haiku)
1717
import Glibc
1818
#endif
1919

2020

2121
#if !os(Windows)
2222
// posix_spawn is not available on Windows.
2323
// posix_spawn is not available on Android.
24+
// posix_spawn is not available on Fuchsia. (TODO: Fuchsia provides liblaunchpad for this)
2425
// posix_spawn is not available on Haiku.
25-
#if !os(Android) && !os(Haiku)
26+
#if !os(Android) && !os(Haiku) && !os(Fuchsia)
2627
// swift_posix_spawn isn't available in the public watchOS SDK, we sneak by the
2728
// unavailable attribute declaration here of the APIs that we need.
2829

@@ -84,7 +85,7 @@ public func spawnChild(_ args: [String])
8485
let childStdin = posixPipe()
8586
let childStderr = posixPipe()
8687

87-
#if os(Android) || os(Haiku)
88+
#if os(Android) || os(Haiku) || os(Fuchsia)
8889
// posix_spawn isn't available on Android. Instead, we fork and exec.
8990
// To correctly communicate the exit status of the child process to this
9091
// (parent) process, we'll use this pipe.
@@ -223,7 +224,7 @@ public func spawnChild(_ args: [String])
223224
return (pid, childStdin.writeFD, childStdout.readFD, childStderr.readFD)
224225
}
225226

226-
#if !os(Android) && !os(Haiku)
227+
#if !os(Android) && !os(Haiku) && !os(Fuchsia)
227228
#if os(Linux)
228229
internal func _make_posix_spawn_file_actions_t()
229230
-> swift_posix_spawn_file_actions_t {
@@ -306,6 +307,8 @@ internal func _getEnviron() -> UnsafeMutablePointer<UnsafeMutablePointer<CChar>?
306307
return environ
307308
#elseif os(Android)
308309
return environ
310+
#elseif os(Fuchsia)
311+
return environ
309312
#elseif os(Cygwin)
310313
return environ
311314
#elseif os(Haiku)

0 commit comments

Comments
 (0)