Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port of Foundation to Android #622

Merged
merged 25 commits into from Sep 22, 2016
Merged

Port of Foundation to Android #622

merged 25 commits into from Sep 22, 2016

Conversation

@johnno1962
Copy link
Contributor

johnno1962 commented Sep 7, 2016

This PR contains the relatively minor changes to have Foundation compile with the Android NDK. There is an associated pull request with the small change apple/swift#4662 to build-script-impl in the swift project to pass through the required arguments to the ninja scritpt generator. The focus has been on getting the code to compile but preliminary testing of Regular expressions, NSHost, fetching Strings from URLs has been successful so far. There is a known issue with needing to hook thread exit to call JNI method DetachCurrentThread which I’ll have to look at before making a PR on swift-corelibs-libdispatch (resolved, see below).

Issues found and not resolved:
Optimising the creation of a string from zero length data - optimisation patched out for now
Fetching the current Locale language for web fetch request headers - also patched out

Changes tested on Linx and OSX build. Included is a minor change fixing a missing -lcurl when building "util/build-script —foundation" on Linux.

As foundation has binary dependencies on libxml2 and libcurl and it's not been able to automate the libdispatch crosscompile the build is dependent on a pre-built binary & header package downloaded by a series of scripts in the swift-corelibs-foundation/android directory. These binaries were built from the public repos pretty much as-is after some Makefilery. Details are in the README.md in this directory.

@@ -1264,12 +1264,15 @@ CF_PRIVATE CFStringRef __CFStringCreateImmutableFunnel3(
contentsDeallocator = __CFGetDefaultAllocator();
}

#ifndef DEPLOYMENT_TARGET_ANDROID
// crashes String.swift, line 51 when creating String from zero length Data

This comment has been minimized.

Copy link
@modocache

modocache Sep 7, 2016

Collaborator

It'd be great to file a https://bugs.swift.org report to track this crash, and include the report number here. That way, we'll know to remove this #ifdef once the report is fixed.

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

IIRC android's memcpy and memmove are not the same as Darwin. That may be the culprit of this issue.

@@ -611,6 +611,7 @@ public func %=(lhs: inout CGFloat, rhs: CGFloat) {
fatalError("%= is not available.")
}

#if !os(Android)

This comment has been minimized.

Copy link
@modocache

modocache Sep 7, 2016

Collaborator

IIRC tgmath is available on Android, and I think the apple/swift tests for tgmath pass when run on Android as well. I must be missing something, but why the #if !os(Android) here? And do the Foundation tests pass this way?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’ll have another look at it. There are many type conversions to get right.

bzero(mutableBytes.advanced(by: range.location), range.length)
#endif

This comment has been minimized.

Copy link
@modocache

modocache Sep 7, 2016

Collaborator

nit-pick: Maybe indent the memset(...) and bzero(...) lines here?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

hmm. not sure about that!

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

might actually be reasonable to just implement a CF inline shim for bzero; it is used a fair amount.

This comment has been minimized.

Copy link
@compnerd

compnerd Sep 7, 2016

Collaborator

Why not change all uses of bzero to memset? bzero is considered deprecated, and POSIX1-2008 removes the specification of bzero entirely.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’ll remove bzero altogether.

@@ -460,7 +475,7 @@ public func NSIntegralRectWithOptions(_ aRect: NSRect, _ opts: NSAlignmentOption
width = 0
}


#if !os(Android)

This comment has been minimized.

Copy link
@modocache

modocache Sep 7, 2016

Collaborator

nit-pick: Looks like some trailing whitespace here.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

zapped

@modocache
Copy link
Collaborator

modocache commented Sep 7, 2016

Issues found and not resolved:
Fetching the current Locale language for web fetch request headers - also patched out

I think this might be related?

return floor( Double(value ) )
}
private func ceil( value: CGFloat ) -> Double {
return floor( Double(value ) )

This comment has been minimized.

Copy link
@mekjaer
@@ -33,6 +35,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

These are a global change to both the swift-corelibs, CFLite and Darwin versions, changes to these types of headers come at definite risk. Can this be done without these modifications in CoreFoundation.h? (and perhaps somewhere else instead?)

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

Which header is which of the two? I can remove it from the Darwin version and add #if __has_include(). The symbols are used in NSHost.swift.

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

So there are two CoreFoundation.h's one for swift and one for Darwin. this one is the Darwin version.

Having alterations to this header could prove to be a non starter because it would prevent us from merging changes back from CoreFoundation. That being said if the reason is compelling enough for us to change the header for ALL platforms then perhaps it can be done, but I think it would be best to tackle it separately if possible.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’ve added netdb.h in the copy of this header in the SwiftRuntime directory with a #if __has_include(..)

#include <syscall.h>
#else

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

If the previous header does not exist what is to say the sys/syscall version exists? Perhaps that should be gated as well and #error'd on the else claiming that syscall.h is required

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

won’t it error anyway? It doesn’t fail silently or anything anti-social. This just improves the odds. I can gate it if you want.

@@ -9,7 +9,7 @@
#if os(OSX) || os(iOS)
import Darwin
#elseif os(Linux)
#elseif os(Linux) || os(Android)

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

why is Android named Glibc? shouldn't it be import Bionic?

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

Probably true, but what does that accomplish for us besides making us put another import in our files?

This comment has been minimized.

Copy link
@phausler

phausler Sep 8, 2016

Member

so perhaps it should be import Libc or System not Darwin then huh?

This comment has been minimized.

Copy link
@parkera

parkera Sep 12, 2016

Member

Anyone want to file a bug for the Swift project? :)

This comment has been minimized.

Copy link
@modocache

modocache Sep 13, 2016

Collaborator

I started this discussion on the swift-evolution mailing list, but was too lazy to push it forward. @compnerd is now leading the charge. 👍

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 14, 2016

Author Contributor

This boilerplate goes away for most users as if they import Foundation as there is an @_exported import of the right C library in NSSwiftRuntime.swift.


// hook for System.out.println()
#if os(Android)
public var debug = {

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

can we name this something else? debug is potentially a very generically named symbol it could be used for storing strings, bools etc that might be something completely different and stomping upon that name might be a bit confusing to developers.

I would expect that NSLog actually hooks to android_log_print so that NSLog's show up in adb

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

This is a temporary convenience. I can rename it or put it in the NSLog class if you like.

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

I agree with @phausler - please no additional public symbols, and especially not one named debug.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 8, 2016

Author Contributor

ANLog?

@@ -624,9 +624,12 @@ fileprivate extension URLSessionTask {
var result = [("Connection", "keep-alive"),
("User-Agent", userAgentString),
]
#if !os(Android)
// Crashes on Android

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

please file a ticket on this. and perhaps a stack trace.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

ok.

This comment has been minimized.

Copy link
@parkera

parkera Sep 12, 2016

Member

And put the JIRA number in the comment so we can find it later.

exit
fi

\cp -v "${BUILD_DIR}/foundation-linux-x86_64/Foundation/libFoundation.so" "${SWIFT_ROOT}/lib/swift/android" &&

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

why is the configuration being passed as a x86_64 triple? shouldn't it be armv7a-linux-androideabi? which would emit the build path as foundation-android-armv7

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’ve no idea how build-script-impl works in detail TBH. I may need some help here.

This comment has been minimized.

Copy link
@phausler

phausler Sep 9, 2016

Member

So the build-script-impl needs to pass a target triple to the foundation configuration script. If that is not being passed you are building a strange hodgepodge beast of potentially incompatible compiled code.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 9, 2016

Author Contributor

Pretty sure this is ok or it wouldn’t even link. https://github.com/SwiftJava/swift/blob/master/utils/build-script-impl#L2269 has been patched to pass in the triple and there is some extra code to make sure that C and Swift get the same one: https://github.com/SwiftJava/swift-corelibs-foundation/blob/master/lib/script.py#L47. The file paths come from build-script-impl

This comment has been minimized.

Copy link
@phausler

phausler Sep 15, 2016

Member

Hmm it looks like the "error" in the script actually is:
SWIFT_BUILD_PATH="$(build_directory ${host} swift)"
etc.

That is claiming to emit the build directory as the host.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 16, 2016

Author Contributor

Trying not to tangle with “build-script-impl”. I understand it’s being refactored to take into account cross compiles apple/swift#4662


\cp -v "${BUILD_DIR}/foundation-linux-x86_64/Foundation/Foundation.swift"* "${SWIFT_ROOT}/lib/swift/android/armv7" &&

rsync -arv "${BUILD_DIR}/foundation-linux-x86_64/Foundation/usr/lib/swift/CoreFoundation" "${SWIFT_ROOT}/lib/swift/"

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

how are these packagable with JNI apps?
can they be just dropped in as a pre-built?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

yes, I have a modified gradle plugin which copies them out of buidl/…/lib/swift/android along with the swift shared lbs.

@phausler
Copy link
Member

phausler commented Sep 7, 2016

For the Android port does this need to have a JNI_OnLoad or is that entry point higher?

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 7, 2016

@phausler
Copy link
Member

phausler commented Sep 7, 2016

Will that mean we will need a hook in Thread.swift for VM context destruction?

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 7, 2016

Absolutely. Android requires you to detach the thread and won’t allow you to do it with anything on the stack, claiming you are "stilll processing". Some help required here also. I haven’t made much headway understanding libdispatch, kqueues, etc. Threads seem to time out after 15 seconds if that sounds familiar crashing the app. Only way to stop it crashing is to keep making requests on the queue.

@@ -203,6 +206,7 @@ strlcat(char * dst, const char * src, size_t maxlen) {
}
return dstlen + srclen;
}
#endif

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

Why is fd_mask defined in an else clause with definitions of strlcpy/strlcat? Are the two related in some way that I am missing?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’m just saving a line. I’ll separate them.

@@ -14,6 +14,8 @@
*/

#include <stdarg.h>

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

Nothing should be above the defined macro.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

This is the only way it would build for some reason.. I’ll take another look

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 14, 2016

Author Contributor

This problem has gone away since I completely rebuilt the toolchain.

@@ -930,7 +930,7 @@ open class NSMutableData : NSData {
}

open func resetBytes(in range: NSRange) {
bzero(mutableBytes.advanced(by: range.location), range.length)
memset(mutableBytes.advanced(by: range.location), 0, range.length)

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

What was wrong with bzero here? I think I would rather have a compatibility shim for Android than excise it from our code, if it's missing.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

Created one in NSSwiftRuntime.swift

import Glibc
#endif

#if os(Android)

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

I'd really like any special case for other platforms to at least come with a comment explaining why it's needed and what could be done to elide it in the future. Even better would be to avoid as much platform-specific code as possible, or put it into a central location so we can count on its presence everywhere in the project.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

agreed though this specific case is difficult to avoid/centralise.

@@ -279,8 +285,10 @@ open class FileManager : NSObject {

#if os(OSX) || os(iOS)
let ti = (TimeInterval(s.st_mtimespec.tv_sec) - kCFAbsoluteTimeIntervalSince1970) + (1.0e-9 * TimeInterval(s.st_mtimespec.tv_nsec))
#else
#elseif !os(Android)

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

I would prefer #elseif os(Android) -- that is, keep the #if in the positive sense.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’ll change this. I wanted the cases to be in order of likelyhood.

private func +( left: CGFloat.NativeType, right: CGFloat.NativeType ) -> Double {
return Double(left) + Double(right)
}
#endif

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

No dead code please.

private func round( value: CGFloat.NativeType ) -> Double {
return round( Double(value) )
}
#if false

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

This and the other changes to CGFloat implementations aren't very clear to me. CGFloat should actually be Float on 32-bit and Double on 64-bit.

This comment has been minimized.

Copy link
@phausler

phausler Sep 7, 2016

Member

this is likely generating incorrect code since the host OS is leaking into the build product (per my commentary on the triples) where it is building with the flags of 64 bit but emitting 32 bit. Which is probably incorrect.

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 8, 2016

Author Contributor

The generated build.ninja seemed correct. I'm thinking the file paths are a red herring.

@@ -459,8 +476,7 @@ public func NSIntegralRectWithOptions(_ aRect: NSRect, _ opts: NSAlignmentOption
if aRect.size.width.native < 0 {
width = 0
}


#if !os(Android) // FIXME!!!

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

I think we need to understand what's going on here; I don't really want to see a // FIXME in code. JIRA number, or a fatalError of some kind (like our NSUnimplemented).

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’m still arguing with the compiler about exactly what is going on in NSGeometry.swift re types. At the moment a signifiant peice of code is effectively commented out.

@@ -7,6 +7,7 @@
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
#if !os(Android)

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

I don't want to comment out whole files for specific platforms like this. Is it impossible to support? If so we should put a fatalError in a useful place (like init).

Either that or we need a better availability strategy for the API (e.g., marking the class as unavailable on android only).

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

This file does not compile at all on Android the way things are. This seemed the least intrusive change

#else
// HACK: Operation Queues not working on Android
completion(data, response, nil)
#endif

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

What's the plan to make sure dispatch and operation queues are actually working?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

Operation queue is probably the first thing to look at as it is in Foundation. I have the suspicion that the dispatch thread problem is going to be difficult to resolve considering how deep the hook would need to be. It means that you can not make any call though to Java from a background thread at the moment. There may have to be other strategies such as a barrier of some sort.

Any hints you can provide here would be greatly appreciated. I can’t even detemine the code path. Should I be looking at the libkqueue or libpwq code for where threads for queues are created and time out??

public static let nodePreserveAll = Options(rawValue: Options([.nodePreserveNamespaceOrder, .nodePreserveAttributeOrder, .nodePreserveEntities, .nodePreservePrefixes, .nodePreserveCDATA, .nodePreserveEmptyElements, .nodePreserveQuotes, .nodePreserveWhitespace, .nodePreserveDTD, .nodePreserveCharacterReferences]).rawValue | UInt(bitPattern: 0xFFF00000))
#else
public static let nodePreserveAll = Options(rawValue: Options([.nodePreserveNamespaceOrder, .nodePreserveAttributeOrder, .nodePreserveEntities, .nodePreservePrefixes, .nodePreserveCDATA, .nodePreserveEmptyElements, .nodePreserveQuotes, .nodePreserveWhitespace, .nodePreserveDTD, .nodePreserveCharacterReferences]).rawValue | UInt(bitPattern: 0x7FF00000))
#endif

This comment has been minimized.

Copy link
@parkera

parkera Sep 7, 2016

Member

Why is this #if required?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 7, 2016

Author Contributor

I’ll check this. the 0xFFF00000 wouldn’t compile before…. It’s not a valid 32 bit int.
Foundation/NSXMLNode.swift:86:339: error: integer literal '4293918720' overflows when stored into 'Int’
Feels like a compiler oversight. I’ll raise a Jira ticket. There seems to be no way to express more than 31 bit integer literals

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 8, 2016

New commit with responses to comments pushed. The battle with NSGeometry is won and Operation queues work if you make sure -DDEPLOYMENT_ENABLE_LIBDISPATCH is defined when you build. Less common code path does not seem to work. I’ll raise a ticket. Focus turns to the problem of detaching threads if they have interacted with JNI before they exit. Any hint about where to look appreciated.

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 16, 2016

Closed https://bugs.swift.org/browse/SR-2587 & https://bugs.swift.org/browse/SR-2588 and raised https://bugs.swift.org/browse/SR-2666 so there are now no known issues apart from whether waiting for support for @available(Android, unavailable) for NSTask.swift in the compiler should be a blocker.

@tkremenek
Copy link
Member

tkremenek commented Sep 16, 2016

@modocache Let's dicsuss extending the CI on swift-dev@swift.org, not in a pull request.

@phausler

This comment has been minimized.

Copy link
Member

phausler commented on CoreFoundation/Base.subproj/CFUtilities.c in bc4cabb Sep 16, 2016

Android's malloc will prefer to return chunks that have already been used since it is a compacting malloc. Whereas other operating systems like Darwin will prefer to return un-used chunks which more often don't need null termination. My guess is that you need to null terminate your buffer always ;)

Also consider writing the buffer as*:

char stack_buffer[1024] = { 0 };
char *buffer = &stack_buffer[0];
CFStringEncoding encoding = kCFStringEncodingUTF8;
CFIndex maxLength = CFStringGetMaximumSizeForEncoding(CFStringGetLength(message), encoding) + 1;
if (maxLength > sizeof(stack_buffer) / sizeof(stack_buffer[0])) {
    buffer = calloc(sizeof(char), maxLength);
}
const char *ptr = CFStringGetCStringPtr(str, encoding);
if (ptr == NULL) {
    if (CFStringGetCString(str, buffer, maxLength, encoding)) {
        ptr = buffer;
    }
}

__android_log_print(priority, _CFProcessName(), "%s", buffer);

if (buffer != &stack_buffer[0]) free(buffer);
  • This was written in a browser and not an IDE so ymmv

This comment has been minimized.

Copy link
Contributor Author

johnno1962 replied Sep 16, 2016

Pushed a rework. Couldn’t get a useful app name out of _CFGetProgname() (_CFProcessName() is declared in the header but not defined anywhere!) so “Swift” it is for now. Tried using CFStringGetCStringPtr() but the strings didn't seem to be null terminated :(

W/app_process32(30898): Match
W/app_process32(30898): Display
W/app_process32(30898): Done
W/app_process32(30898): Sleeping����(

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 19, 2016

Ready to go this end. All known issues resolved. @available(Android, unavailable) will have to wait.

@@ -196,6 +196,9 @@ internal func NSRequiresConcreteImplementation(_ fn: String = #function, file: S
}

internal func NSUnimplemented(_ fn: String = #function, file: StaticString = #file, line: UInt = #line) -> Never {
#if os(Android)
NSLog("\(fn) is not yet implemented. \(file):\(line)")
#endif

This comment has been minimized.

Copy link
@parkera

parkera Sep 22, 2016

Member

Why did we add an NSLog here?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 22, 2016

Author Contributor

fatalError() doesn’t print anything on Android (asserts do). Just giving people a pointer.

This comment has been minimized.

Copy link
@phausler

phausler Sep 22, 2016

Member

shouldn't fatalError call __android_log_print on android?

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 22, 2016

Author Contributor

It should but this is a Foundation PR. I’ll take a look. Annoyingly, using __android_log_print requires a -llog when you link so it wouldn’t be a trivial change. Looks like a change to https://github.com/apple/swift/blob/master/stdlib/public/runtime/Errors.cpp#L204

This comment has been minimized.

Copy link
@johnno1962
@parkera
Copy link
Member

parkera commented Sep 22, 2016

@swift-ci please test

@parkera
Copy link
Member

parkera commented Sep 22, 2016

Let's give this a shot.

@parkera parkera merged commit 16f83dd into apple:master Sep 22, 2016
1 check passed
1 check passed
Swift Test Linux Platform Build finished.
Details
@parkera
Copy link
Member

parkera commented Sep 22, 2016

We can follow up with separate changes for the rest. Thanks for tackling this @johnno1962 !

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 22, 2016

Thanks Tony 👍

@johnno1962
Copy link
Contributor Author

johnno1962 commented Sep 23, 2016

Reminder: Example program https://github.com/SwiftJava/swift-android-samples,
Pre-compiled toolchain here http://johnholdsworth.com/android_toolchain.tgz

CFIndex maxLength = CFStringGetMaximumSizeForEncoding(CFStringGetLength(message), encoding) + 1;

if (maxLength > sizeof(stack_buffer) / sizeof(stack_buffer[0])) {
buffer = calloc(sizeof(char), maxLength);

This comment has been minimized.

Copy link
@lhoward

lhoward Sep 23, 2016

Contributor

should check calloc() return value

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 23, 2016

Author Contributor

Too late now...

This comment has been minimized.

Copy link
@parkera

parkera Sep 23, 2016

Member

Not too late - open up another PR. =)

This comment has been minimized.

Copy link
@johnno1962

johnno1962 Sep 23, 2016

Author Contributor

Alright already, new PR #655

@zayass
Copy link
Contributor

zayass commented Mar 21, 2017

Hi @johnno1962

it's not been able to automate the libdispatch crosscompile

Can you little explain why it is hard to automate and how you build this libdispatch binary?

@johnno1962
Copy link
Contributor Author

johnno1962 commented Mar 21, 2017

Things have moved on a little since this PR. Some detail about how to build libdispatch are on this PR apple/swift-corelibs-libdispatch#162

zayass added a commit to zayass/swift-corelibs-foundation that referenced this pull request Apr 18, 2017
zayass added a commit to zayass/swift-corelibs-foundation that referenced this pull request Apr 21, 2017
zayass added a commit to zayass/swift-corelibs-foundation that referenced this pull request Apr 21, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

You can’t perform that action at this time.