Yes, that would be a problem. I suppose a second phase of FHS/Freestanding Bundle support would be to locate the bundle directory from the main executable location extending _CFBundleCopyBundleURLForExecutablePath
(which is used by Bundle.main
, Bundle(class:)
and Bundle(identifier:)
).
Once this is implemented we could debate the introduction of a new initializer Bundle(executableURL:)
/ Bundle(executablePath:)
which would solve the aforementioned problem.
let bundle = Bundle(executablePath: "/usr/local/lib/libCoreGraphics.so")!
bundle.bundlePath // "/usr/local/share/CoreGraphics.resources"
bundle.resourcesPath // "/usr/local/share/CoreGraphics.resources"
bundle.executablePath // "/usr/local/lib/libCoreGraphics.so"
let bundle = Bundle(executablePath: "CoreGraphics.dll")!
bundle.bundlePath // "CoreGraphics.resources"
bundle.resourcesPath // "CoreGraphics.resources"
bundle.executablePath // "CoreGraphics.dll"
let bundle = Bundle(executablePath: "Bundle.bundle/Contents/MacOS/Bundle")!
bundle.bundlePath // "Bundle.bundle"
bundle.resourcesPath // "Bundle.bundle/Contents/Resources"
bundle.executablePath // "Bundle.bundle/Contents/MacOS/Bundle"
This new initializer would also allow to retrieve a Mach-O binary-embedded Info.plist
in executables without relying in Core Foundation. For example, now if you what to get the embedded Info.plist
you have to use:
CFBundleCopyInfoDictionaryForURL(URL(fileURLWithPath:"/usr/libexec/secd") as CFURL)
While with the new API could be done directly with Foundation:
Bundle(executablePath: "/usr/libexec/secd")?.infoDictionary
Radar Reference: 38359891