swiftlang / swift-sdk-generator

Generate Swift SDKs for cross-compilation
Apache License 2.0
170 stars 15 forks source link

Error building with docker #88

Closed t089 closed 6 months ago

t089 commented 6 months ago

I am trying to build a SDK that includes libvips:

I created an image:

$ cat Dockerfile
FROM swift:5.10-jammy                                                                                                                                 
RUN apt update && apt -y install libvips libvips-dev && apt -y clean

$ docker build -t swift-5.10-vips --platform linux/amd64 -f Dockerfile .

Then, using the SDK generator:

$ swift run swift-sdk-generator make-linux-sdk \
       --target x86_64-unknown-linux-gnu \
       --swift-version 5.10-RELEASE \
       --with-docker \
       --from-container-image swift-5.10-vips:latest \
       --sdk-name 5.10-RELEASE_ubuntu_jammy_x86_64_vips -v

Fails with:

Launching a Docker container to copy Swift SDK for the target triple from it...
docker run --rm --platform=linux/amd64 -d swift-5.10-vips:latest tail -f /dev/null
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/include /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/include
docker exec 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6 sh -c 'test -e "/usr/lib64" && echo "y" || echo "n"'
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib64 /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib64
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib/clang /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/clang
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib/gcc /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/gcc
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib/swift /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/swift
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib/swift_static /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/swift_static
docker exec 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6 sh -c 'test -e "/usr/lib/x86_64-linux-gnu" && echo "y" || echo "n"'
docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib/x86_64-linux-gnu /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/x86_64-linux-gnu
invalid symlink "/Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/x86_64-linux-gnu/hdf5/serial/include" -> "../../../../include/hdf5/serial"
docker stop 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6
Error: Process launched with CommandInfo(command: "docker cp 1c481dc1bea5304a25eebc0f923c625610732380570ae0b6668d320e7966dcb6:/usr/lib/x86_64-linux-gnu /Users/tobias/Developing/swift-sdk-generator/Bundles/5.10-RELEASE_ubuntu_jammy_x86_64_vips.artifactbundle/5.10-RELEASE_ubuntu_jammy_x86_64_vips/x86_64-unknown-linux-gnu/ubuntu-jammy.sdk/usr/lib/x86_64-linux-gnu", file: "/Users/tobias/Developing/swift-sdk-generator/Sources/SwiftSDKGenerator/Generator/SwiftSDKGenerator.swift", line: 124) failed with exit code 1
t089 commented 6 months ago

Found a workaround. Seems like docker cp does not like symlinks in the SOURCE_DIR. But there exists a workaround: piping the copy to tar:

docker cp CONTAINER:/path/in/container - | tar xC $(dirname /path/in/host)

Changing copyFromDockerContainer, the command succeeds.


 func copyFromDockerContainer(
    id: String,
    from containerPath: FilePath,
    to localPath: FilePath,
    failIfNotExists: Bool = true
  ) async throws {
    if !failIfNotExists {
      guard try await doesPathExist(containerPath, inContainer: id)
      else { return }
    }
    try await Shell.run(
      "\(Self.dockerCommand) cp \(id):\(containerPath) - | tar xC $(dirname \(localPath))",
      shouldLogCommands: self.isVerbose
    )
  }