vgorloff/swift-everywhere-toolchain

Swift package using C sources fail to link

gshahbazian opened this issue · 5 comments

Hey @vgorloff thanks for all the great work here!

I am running into a linker error when importing a swift package that wraps a C library.
Package being imported: https://github.com/gshahbazian/SwiftGumbo

Exports.swift:

...
import SwiftGumbo

@_cdecl("Java_com_home_helloNDK_SwiftLib_sayHello")
public func sayHello() {
   let g = SwiftGumbo(html: #"<html><body><h1>HEY <span>WHATS</span> UP</h1><p>Nothing</p></body></html>"#)
   let text = g.root.textContent

   AndroidLogger.info("SA - SwiftCore: Works! \(text)")
   probeDispatch()
   probeOperation()
   probeSerialization()
   tester.test()
}
...

Package.swift:

// swift-tools-version:5.0

import PackageDescription

let package = Package(
   name: "HelloJNI",
   products: [
      .library(name: "HelloJNICore", type: .dynamic, targets: ["HelloJNICore"]),
      .library(name: "NDKLog", targets: ["NDKLog"])
   ],
   dependencies: [
      .package(url: "https://github.com/gshahbazian/SwiftGumbo", .exact("1.0.0")),
   ],
   targets: [
      .target(name: "HelloJNICore", dependencies: ["NDKLog", "SwiftGumbo"]),
      .target(name: "NDKLog", dependencies: ["sysNDKLog"]),
      .systemLibrary(name: "sysNDKLog"),
   ]
)

Compile error:

...
[18/19] Compiling HelloJNICore Exports.swift
<unknown>:0: error: error opening input file '/Users/gabepop/Downloads/swift-everywhere-samples-master/Android/app/build/swift-x86_64/x86_64-apple-macosx/release/CGumboParser.build/ascii.c.o' (Don't know how to extract from object fileformat)
<unknown>:0: error: swift-autolink-extract command failed with exit code 1 (use -v to see invocation)
[18/19] Linking libHelloJNICore.dylib

The debug configuration still broken. But i was able to build SwiftGumbo release configuration with following command:

export SWIFT_EXEC=/PathToDownloadedToolchain/swift-android-toolchain/usr/bin/swiftc-arm-linux-androideabi
swift build -c release --destination ./android-armv7.json

Where ./android-armv7.json is below:

{
  "version": 1,
  "sdk": "/PathToDownloadedToolchain/swift-android-toolchain",
  "toolchain-bin-dir": "/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/bin",
  "target": "armv7-none-linux-androideabi",
  "dynamic-library-extension": "so",
  "extra-cc-flags": [
    "-v",
    "-I/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include",
    "-I/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi"
  ],
  "extra-swiftc-flags": [
    "-v",
    "-tools-directory",
    "/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/bin",
    "-Xcc",
    "-I/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include",
    "-Xcc",
    "-I/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi",
    "-Xclang-linker",
    "--sysroot=/usr/local/ndk/20.1.5948944/platforms/android-24/arch-arm",
    "-Xclang-linker",
    "--gcc-toolchain=/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64",
    "-L",
    "/usr/local/ndk/20.1.5948944/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a",
    "-L",
    "/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x",
    "-L",
    "/usr/local/ndk/20.1.5948944/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/24",
    "-L",
    "/PathToDownloadedToolchain/swift-android-toolchain/usr/lib/swift/android/armv7"
  ],
  "extra-cpp-flags": [
    "-v"
  ]
}

This is an archived sample project with two build scripts (for macOS and Android).
SwiftGumboTest.zip

Also possible now (fix still in develop branch) to build without --destination flag.

cd SwiftGumboProject
/...../swift-android-toolchain/usr/bin/swift-build-arm-linux-androideabi -c release

Ok. The issue with SPM Debug Builds now fixed in https://github.com/vgorloff/swift-everywhere-toolchain/releases/tag/1.0.57.
Closing issue.

Thanks for all your work on this @vgorloff!