I am trying to make bindings to libcamera using SPM systemLibrary. But when I try to use it, swift cannot find the classes defined in C++.
Project structure:
├── Package.swift
├── Sources
├── examples
│ └── main.swift
└── libcamera
├── libcamera.hpp
└── module.modulemap
Package.swift:
// swift-tools-version: 5.9
import PackageDescription
let package = Package(
name: "libcamera",
products: [
.library(
name: "libcamera",
targets: ["libcamera"]),
],
dependencies: [
],
targets: [
.systemLibrary(
name: "libcamera",
pkgConfig: "libcamera"
),
.executableTarget(
name: "examples",
dependencies: ["libcamera"],
swiftSettings: [.interoperabilityMode(.Cxx)]
)
]
)
libcamera.hpp:
#include <libcamera/libcamera.h>
module.modulemap:
module libcamera {
umbrella header "libcamera.hpp"
link "camera"
}
main.swift:
import libcamera
let cameraManager = libcamera.CameraManager()
let cameras = cameraManager.cameras()
let cameraSelected = 0
let cam = cameras.get(cameraSelected)
print("Using camera:", cam.properties())
When I run:
swift run -Xcc -std=gnu++20
The output is:
building for debugging...
error: emit-module command failed with exit code 1 (use -v to see invocation)
/app/Sources/examples/main.swift:3:31: error: type 'libcamera' has no member 'CameraManager'
let cameraManager = libcamera.CameraManager()
~~~~~~~~~ ^~~~~~~~~~~~~
/app/Sources/examples/main.swift:3:31: error: type 'libcamera' has no member 'CameraManager'
let cameraManager = libcamera.CameraManager()
~~~~~~~~~ ^~~~~~~~~~~~~
error: fatalError
libcamera
is a namespace defined in C++, so accesssing CameraManager would be like this in C++: libcamera::CameraManager
.
using swift run -Xcc -std=gnu++20 -v
warning: 'app': /usr/bin/swift-frontend -frontend -c -primary-file /app/Package.swift -target aarch64-unknown-linux-gnu -Xllvm -aarch64-use-tbi -disable-objc-interop -I /usr/lib/swift/pm/ManifestAPI -vfsoverlay /tmp/TemporaryDirectory.FGg31O/vfs.yaml -swift-version 5 -package-description-version 5.9.0 -new-driver-path /usr/bin/swift-driver -disable-implicit-concurrency-module-import -disable-implicit-string-processing-module-import -empty-abi-descriptor -resource-dir /usr/lib/swift -module-name main -plugin-path /usr/lib/swift/host/plugins -plugin-path /usr/local/lib/swift/host/plugins -o /tmp/TemporaryDirectory.MxD2Za/Package-1.o
/usr/bin/swift-autolink-extract /tmp/TemporaryDirectory.MxD2Za/Package-1.o -o /tmp/TemporaryDirectory.MxD2Za/main-1.autolink
/usr/bin/clang -fuse-ld=gold -pie -Xlinker -rpath -Xlinker /usr/lib/swift/linux /usr/lib/swift/linux/aarch64/swiftrt.o /tmp/TemporaryDirectory.MxD2Za/Package-1.o @/tmp/TemporaryDirectory.MxD2Za/main-1.autolink -L /usr/lib/swift/linux -lswiftCore --target=aarch64-unknown-linux-gnu -v -L /usr/lib/swift/pm/ManifestAPI -lPackageDescription -Xlinker -rpath -Xlinker /usr/lib/swift/pm/ManifestAPI -o /tmp/TemporaryDirectory.D9hPGN/app-manifest
Swift version 5.9.2 (swift-5.9.2-RELEASE)
Target: aarch64-unknown-linux-gnu
clang version 13.0.0 (https://github.com/apple/llvm-project.git 2b42c5ce063a374fb22676e27505a22fe411ea8c)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/aarch64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
"/usr/bin/ld.gold" -pie -EL --hash-style=gnu --eh-frame-hdr -m aarch64linux -dynamic-linker /lib/ld-linux-aarch64.so.1 -o /tmp/TemporaryDirectory.D9hPGN/app-manifest /lib/aarch64-linux-gnu/Scrt1.o /lib/aarch64-linux-gnu/crti.o /usr/bin/../lib/gcc/aarch64-linux-gnu/12/crtbeginS.o -L/usr/lib/swift/linux -L/usr/lib/swift/pm/ManifestAPI -L/usr/bin/../lib/gcc/aarch64-linux-gnu/12 -L/lib/aarch64-linux-gnu -L/usr/lib/aarch64-linux-gnu -L/lib -L/usr/lib -rpath /usr/lib/swift/linux /usr/lib/swift/linux/aarch64/swiftrt.o /tmp/TemporaryDirectory.MxD2Za/Package-1.o -lswiftSwiftOnoneSupport -lswiftCore -lswiftCore -lPackageDescription -rpath /usr/lib/swift/pm/ManifestAPI -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib/gcc/aarch64-linux-gnu/12/crtendS.o /lib/aarch64-linux-gnu/crtn.o
Planning build
Building for debugging...
/usr/bin/swiftc -module-name examples -emit-dependencies -emit-module -emit-module-path /app/.build/aarch64-unknown-linux-gnu/debug/examples.swiftmodule -output-file-map /app/.build/aarch64-unknown-linux-gnu/debug/examples.build/output-file-map.json -incremental -c /app/Sources/examples/main.swift -I /app/.build/aarch64-unknown-linux-gnu/debug -target aarch64-unknown-linux-gnu -swift-version 5 -v -enable-batch-mode -index-store-path /app/.build/aarch64-unknown-linux-gnu/debug/index/store -Onone -enable-testing -g -j4 -DSWIFT_PACKAGE -DDEBUG -Xcc -fmodule-map-file=/app/Sources/libcamera/module.modulemap -I/usr/local/include/libcamera -module-cache-path /app/.build/aarch64-unknown-linux-gnu/debug/ModuleCache -parseable-output -Xfrontend -entry-point-function-name -Xfrontend examples_main -color-diagnostics -cxx-interoperability-mode=default -Xcc -fPIC -Xcc -std=gnu++20 -package-name app -Xcc -fno-omit-frame-pointer
Swift version 5.9.2 (swift-5.9.2-RELEASE)
Target: aarch64-unknown-linux-gnu
/usr/bin/swift-frontend -frontend -emit-module -experimental-skip-non-inlinable-function-bodies-without-types /app/Sources/examples/main.swift -target aarch64-unknown-linux-gnu -Xllvm -aarch64-use-tbi -disable-objc-interop -cxx-interoperability-mode=default -I /app/.build/aarch64-unknown-linux-gnu/debug -I /usr/local/include/libcamera -color-diagnostics -enable-testing -g -module-cache-path /app/.build/aarch64-unknown-linux-gnu/debug/ModuleCache -swift-version 5 -Onone -D SWIFT_PACKAGE -D DEBUG -new-driver-path /usr/bin/swift-driver -entry-point-function-name examples_main -empty-abi-descriptor -resource-dir /usr/lib/swift -enable-anonymous-context-mangled-names -Xcc -fmodule-map-file=/app/Sources/libcamera/module.modulemap -Xcc -fPIC -Xcc -std=gnu++20 -Xcc -fno-omit-frame-pointer -module-name examples -package-name app -plugin-path /usr/lib/swift/host/plugins -plugin-path /usr/local/lib/swift/host/plugins -emit-module-doc-path /app/.build/aarch64-unknown-linux-gnu/debug/examples.swiftdoc -emit-module-source-info-path /app/.build/aarch64-unknown-linux-gnu/debug/examples.swiftsourceinfo -emit-dependencies-path /app/.build/aarch64-unknown-linux-gnu/debug/examples.build/examples.emit-module.d -o /app/.build/aarch64-unknown-linux-gnu/debug/examples.swiftmodule
/usr/bin/swift-frontend -frontend -c -primary-file /app/Sources/examples/main.swift -emit-dependencies-path /app/.build/aarch64-unknown-linux-gnu/debug/examples.build/main.d -emit-reference-dependencies-path /app/.build/aarch64-unknown-linux-gnu/debug/examples.build/main.swiftdeps -target aarch64-unknown-linux-gnu -Xllvm -aarch64-use-tbi -disable-objc-interop -cxx-interoperability-mode=default -I /app/.build/aarch64-unknown-linux-gnu/debug -I /usr/local/include/libcamera -color-diagnostics -enable-testing -g -module-cache-path /app/.build/aarch64-unknown-linux-gnu/debug/ModuleCache -swift-version 5 -Onone -D SWIFT_PACKAGE -D DEBUG -new-driver-path /usr/bin/swift-driver -entry-point-function-name examples_main -empty-abi-descriptor -resource-dir /usr/lib/swift -enable-anonymous-context-mangled-names -Xcc -fmodule-map-file=/app/Sources/libcamera/module.modulemap -Xcc -fPIC -Xcc -std=gnu++20 -Xcc -fno-omit-frame-pointer -module-name examples -package-name app -plugin-path /usr/lib/swift/host/plugins -plugin-path /usr/local/lib/swift/host/plugins -o /app/.build/aarch64-unknown-linux-gnu/debug/examples.build/main.swift.o -index-store-path /app/.build/aarch64-unknown-linux-gnu/debug/index/store -index-system-modules
error: emit-module command failed with exit code 1 (use -v to see invocation)
/app/Sources/examples/main.swift:3:31: error: type 'libcamera' has no member 'CameraManager'
let cameraManager = libcamera.CameraManager()
~~~~~~~~~ ^~~~~~~~~~~~~
/app/Sources/examples/main.swift:3:31: error: type 'libcamera' has no member 'CameraManager'
let cameraManager = libcamera.CameraManager()
~~~~~~~~~ ^~~~~~~~~~~~~
error: fatalError