Roberto Leinardi
01/24/2025, 6:00 PMlinuxX64
on Linux or macosArm64
on macOS).
• When building in isolation, the generated artifacts work fine on both platforms, and I can publish them separately.
What I Want to Achieve
• I want to publish a single multiplatform artifact that supports both linuxX64
and macosArm64
.
What I Tried
• I enabled both targets in the project.
• I also tried enabling kotlin.mpp.enableCInteropCommonization=true
to unify the cinterop definitions.
The Issue
• When enabling multiple targets, the common nativeMain
code doesn’t build anymore because the cinterop .def
files are managed per specific target.
• With CInterop Commonization enabled, the generated code fails to compile on Linux.
• Example: Functions like g_module_build_path
and g_module_close
are no longer provided by cinterop.
• I suspect this happens because cinterop parses the headers in a "common" environment, and Linux-specific functions might be filtered out due to platform-specific macros or compiler flags.
Why Moving Away From nativeMain
Doesn’t Work
• Duplicating the bindings per target is not a viable option.
• A lot of shared code in nativeMain
depends on native functions (e.g., g_free
and g_type_interfaces
).
• It also uses type aliases (e.g., GType
) and generated bindings classes (e.g., GLib
and GObject
).
• If I move away from nativeMain
, I would need to duplicate all this code for each platform, which is not maintainable.
Questions
What are my options for handling this scenario?
How can I make multiplatform cinterop work with shared nativeMain
while supporting platform-specific native functions?
Are there other options to end up with a single multiplatform artifact on MavenCentral?
Any advice would be greatly appreciated.