Building SwiftPM with Foundation

For SwiftPM, I'm looking to replace some POSIX calls with Foundation. NSTask
and NSFileManager amongst others. I've created a few PRs already for this, see
[1]. However before these can be merged, the build scripts need to be adjusted
to allow SwiftPM to build against Foundation.

There has already been some pointers posted in the comments on one of these PRs,
see [2]. I tried to implement those, see my changes to the swift build-script in
[3] and the "fake toolchain" in SwiftPM in [4]. However SwiftPM builds stage1;
stage2 is still failing. I don't know how to proceed; I've only scratched the surface regarding build systems and the many tools used to build the various swift parts. I would really love some help going forward.

Β Β Β Β $ swift/utils/build-script -R --swiftpm
Β Β Β Β (...)
Β Β Β Β --- bootstrap: note: building self-hosted 'swift-build': env SWIFT_EXEC=/media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swiftc SWIFT_BUILD_PATH=/media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64 /media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swift-build-stage1 -Xlinker -rpath -Xlinker $ORIGIN/../lib/swift/linux -Xlinker -L -Xlinker /media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xlinker -rpath -Xlinker /media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xswiftc -I/media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xswiftc -I/media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation/usr/lib/swift

Β Β Β Β /media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swift-build-stage1: error while loading shared libraries: libFoundation.so: cannot open shared object file: No such file or directory
Β Β Β Β --- bootstrap: error: build failed with exit status 127

- Bouke

[1]: Pull requests Β· apple/swift-package-manager Β· GitHub
[2]: SR-1005: [Foundation] Use NSFileHandle instead of fopen by Bouke Β· Pull Request #292 Β· apple/swift-package-manager Β· GitHub

[3]: https://github.com/apple/swift/compare/master...Bouke:swiftpm-foundation
[4]: https://github.com/apple/swift-package-manager/compare/ef491db...Bouke:swiftpm-foundation

What you will need to do to make this work is to get the "fake toolchain" to look like how an actual toolchain looks on disk (e.g., libFoundation in the same relative position, in `<something>/../lib/swift/linux`), presumably using a symlink. The special rpath is what is causing the built swift-build (in this case the stage1 swift-build) to look in that directory for its libraries. If libFoundation.so is there, then that should suffice for it to be found and loaded.

- Daniel

Β·Β·Β·

On May 5, 2016, at 2:04 AM, Bouke Haarsma via swift-dev <swift-dev@swift.org> wrote:

For SwiftPM, I'm looking to replace some POSIX calls with Foundation. NSTask
and NSFileManager amongst others. I've created a few PRs already for this, see
[1]. However before these can be merged, the build scripts need to be adjusted
to allow SwiftPM to build against Foundation.

There has already been some pointers posted in the comments on one of these PRs,
see [2]. I tried to implement those, see my changes to the swift build-script in
[3] and the "fake toolchain" in SwiftPM in [4]. However SwiftPM builds stage1;
stage2 is still failing. I don't know how to proceed; I've only scratched the
surface regarding build systems and the many tools used to build the various
swift parts. I would really love some help going forward.

    $ swift/utils/build-script -R --swiftpm
    (...)
    --- bootstrap: note: building self-hosted 'swift-build': env SWIFT_EXEC=/media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swiftc SWIFT_BUILD_PATH=/media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64 /media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swift-build-stage1 -Xlinker -rpath -Xlinker $ORIGIN/../lib/swift/linux -Xlinker -L -Xlinker /media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xlinker -rpath -Xlinker /media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xswiftc -I/media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xswiftc -I/media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation/usr/lib/swift
    /media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swift-build-stage1: error while loading shared libraries: libFoundation.so: cannot open shared object file: No such file or directory
    --- bootstrap: error: build failed with exit status 127

- Bouke

[1]: Pull requests Β· apple/swift-package-manager Β· GitHub
[2]: SR-1005: [Foundation] Use NSFileHandle instead of fopen by Bouke Β· Pull Request #292 Β· apple/swift-package-manager Β· GitHub
[3]: https://github.com/apple/swift/compare/master...Bouke:swiftpm-foundation
[4]: https://github.com/apple/swift-package-manager/compare/ef491db...Bouke:swiftpm-foundation_______________________________________________
swift-dev mailing list
swift-dev@swift.org <mailto:swift-dev@swift.org>
https://lists.swift.org/mailman/listinfo/swift-dev

I performed an strace while running the build. Once it starts looking for libFoundation.so it only searches the build location inside the swift directory, but none of the provided -Xlinker paths.

10795 execve("<somedir>/swiftpm-linux-x86_64/debug/swift-build-stage1", ["<somedir>"..., "-Xlinker", "-rpath", "-Xlinker", "$ORIGIN/../lib/swift/linux", "-Xlinker", "-L", "-Xlinker", "<somedir>"..., "-Xlinker", "-rpath", "-Xlinker", "<somedir>"..., "-Xswiftc", "-I<somedir>"..., "-Xswiftc", ...], [/* 72 vars */]) = 0
(snip 58 lines)
10795 open("<somedir>/swift-linux-x86_64/lib/swift/linux/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 open("<somedir>/swift-linux-x86_64/lib/swift/linux/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
10795 open("/lib/x86_64-linux-gnu/tls/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/x86_64-linux-gnu/tls/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/lib/x86_64-linux-gnu/tls/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/x86_64-linux-gnu/tls", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/lib/x86_64-linux-gnu/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/x86_64-linux-gnu/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/lib/x86_64-linux-gnu/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/x86_64-linux-gnu", {st_mode=S_IFDIR|0755, st_size=16384, ...}) = 0
10795 open("/usr/lib/x86_64-linux-gnu/tls/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/x86_64-linux-gnu/tls/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/usr/lib/x86_64-linux-gnu/tls/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/x86_64-linux-gnu/tls", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/usr/lib/x86_64-linux-gnu/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/x86_64-linux-gnu/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/usr/lib/x86_64-linux-gnu/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/x86_64-linux-gnu", {st_mode=S_IFDIR|0755, st_size=69632, ...}) = 0
10795 open("/lib/tls/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/tls/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/lib/tls/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/tls", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/lib/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/lib/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
10795 open("/usr/lib/tls/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/tls/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/usr/lib/tls/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/tls", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/usr/lib/x86_64/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib/x86_64", 0x7ffc521054a0) = -1 ENOENT (No such file or directory)
10795 open("/usr/lib/libFoundation.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
10795 stat("/usr/lib", {st_mode=S_IFDIR|0755, st_size=20480, ...}) = 0
10795 writev(2, [{"/media/sf_Developer/apple/build/"..., 97}, {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libFoundation.so", 16}, {": ", 2}, {"cannot open shared object file", 30}, {": ", 2}, {"No such file or directory", 25}, {"\n", 1}], 10) = 213
10795 exit_group(127) = ?
10795 +++ exited with 127 +++

-Bouke

Β·Β·Β·

On 5 mei 2016, at 12:22, Bouke Haarsma <bouke@haarsma.eu> wrote:

The build directory of SwiftPM looks like this when stage2 is build;

<somedir>/swiftpm-linux-x86_64/
β”œβ”€β”€ .bootstrap
β”‚ β”œβ”€β”€ bin
β”‚ β”‚ β”œβ”€β”€ swift-build
β”‚ β”‚ └── swift-test
(...)
β”‚ β”œβ”€β”€ lib
(...)
β”‚ β”‚ β”œβ”€β”€ swift
β”‚ β”‚ β”‚ β”œβ”€β”€ linux
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ libFoundation.so -> <somedir>/foundation-linux-x86_64/Foundation/libFoundation.so
β”‚ β”‚ β”‚ β”‚ └── x86_64
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ Foundation.swiftdoc -> <somedir>/foundation-linux-x86_64/Foundation/Foundation.swiftdoc
β”‚ β”‚ β”‚ β”‚ └── Foundation.swiftmodule -> <somedir>/foundation-linux-x86_64/Foundation/Foundation.swiftmodule
β”‚ β”‚ β”‚ └── pm
β”‚ β”‚ β”‚ β”œβ”€β”€ libPackageDescription.so
β”‚ β”‚ β”‚ └── PackageDescription.swiftmodule
(...)
β”‚ β”œβ”€β”€ modules
(...)
β”‚ β”‚ β”œβ”€β”€ CoreFoundation -> <somedir>/foundation-linux-x86_64/Foundation/usr/lib/swift/CoreFoundation
β”‚ β”‚ β”œβ”€β”€ Foundation.swiftdoc -> <somedir>/foundation-linux-x86_64/Foundation/Foundation.swiftdoc
β”‚ β”‚ β”œβ”€β”€ Foundation.swiftmodule -> <somedir>/foundation-linux-x86_64/Foundation/Foundation.swiftmodule
(...)
β”œβ”€β”€ debug
β”‚ β”œβ”€β”€ swift-build-stage1 -> <somedir>/swiftpm-linux-x86_64/.bootstrap/bin/swift-build
β”‚ β”œβ”€β”€ swift-build-tool -> <somedir>/llbuild-linux-x86_64/bin/swift-build-tool
β”‚ └── swiftc -> <somedir>/swift-linux-x86_64/bin/swiftc
└── lib -> <somedir>/swiftpm-linux-x86_64/.bootstrap/lib

So I’m not sure what else is missing here?

Also, the correct path for Foundation is already being passed to the build command using -Xlinker arguments, why doesn’t that work as well?

<somedir>/swiftpm-linux-x86_64/debug/swift-build-stage1 \
    -Xlinker -rpath -Xlinker $ORIGIN/../lib/swift/linux \
    -Xlinker -L -Xlinker <somedir>/foundation-linux-x86_64/Foundation \
    -Xlinker -rpath -Xlinker <somedir>/foundation-linux-x86_64/Foundation \
    -Xswiftc -I<somedir>/foundation-linux-x86_64/Foundation \
    -Xswiftc -I<somedir>/foundation-linux-x86_64/Foundation/usr/lib/swift

-Bouke

On 5 mei 2016, at 11:17, Daniel Dunbar <daniel_dunbar@apple.com <mailto:daniel_dunbar@apple.com>> wrote:

What you will need to do to make this work is to get the "fake toolchain" to look like how an actual toolchain looks on disk (e.g., libFoundation in the same relative position, in `<something>/../lib/swift/linux`), presumably using a symlink. The special rpath is what is causing the built swift-build (in this case the stage1 swift-build) to look in that directory for its libraries. If libFoundation.so is there, then that should suffice for it to be found and loaded.

- Daniel

On May 5, 2016, at 2:04 AM, Bouke Haarsma via swift-dev <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:

For SwiftPM, I'm looking to replace some POSIX calls with Foundation. NSTask
and NSFileManager amongst others. I've created a few PRs already for this, see
[1]. However before these can be merged, the build scripts need to be adjusted
to allow SwiftPM to build against Foundation.

There has already been some pointers posted in the comments on one of these PRs,
see [2]. I tried to implement those, see my changes to the swift build-script in
[3] and the "fake toolchain" in SwiftPM in [4]. However SwiftPM builds stage1;
stage2 is still failing. I don't know how to proceed; I've only scratched the
surface regarding build systems and the many tools used to build the various
swift parts. I would really love some help going forward.

    $ swift/utils/build-script -R --swiftpm
    (...)
    --- bootstrap: note: building self-hosted 'swift-build': env SWIFT_EXEC=/media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swiftc SWIFT_BUILD_PATH=/media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64 /media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swift-build-stage1 -Xlinker -rpath -Xlinker $ORIGIN/../lib/swift/linux -Xlinker -L -Xlinker /media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xlinker -rpath -Xlinker /media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xswiftc -I/media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation -Xswiftc -I/media/sf_Developer/apple/build/Ninja-ReleaseAssert/foundation-linux-x86_64/Foundation/usr/lib/swift
    /media/sf_Developer/apple/build/Ninja-ReleaseAssert/swiftpm-linux-x86_64/debug/swift-build-stage1: error while loading shared libraries: libFoundation.so: cannot open shared object file: No such file or directory
    --- bootstrap: error: build failed with exit status 127

- Bouke

[1]: Pull requests Β· apple/swift-package-manager Β· GitHub
[2]: SR-1005: [Foundation] Use NSFileHandle instead of fopen by Bouke Β· Pull Request #292 Β· apple/swift-package-manager Β· GitHub
[3]: https://github.com/apple/swift/compare/master...Bouke:swiftpm-foundation
[4]: https://github.com/apple/swift-package-manager/compare/ef491db...Bouke:swiftpm-foundation_______________________________________________
swift-dev mailing list
swift-dev@swift.org <mailto:swift-dev@swift.org>
https://lists.swift.org/mailman/listinfo/swift-dev

I'm still seeing "~/swift-source/build/Ninja-ReleaseAssert/swiftpm-linux-aarch64/aarch64-unknown-linux/release/swift-build-stage1: error while loading shared libraries: libFoundation.so: cannot open shared object file: No such file or directory", is there anything planned to enable building swiftpm on Linux?

2 Likes