JuliaInterop / Clang.jl

C binding generator and Julia interface to libclang
https://juliainterop.github.io/Clang.jl/
MIT License
222 stars 68 forks source link

There is no definition for dispatch_data_t #498

Open Gnimuc opened 3 months ago

Gnimuc commented 3 months ago

Discussed in https://github.com/JuliaInterop/Clang.jl/discussions/497

Originally posted by **maleadt** June 18, 2024 I'm trying to wrap some macOS C header, which has the following: ``` #ifdef __APPLE__ #import #endif // __APPLE__ ``` That header apparently has issues with Clang.jl, leading to: ``` [ Info: Building the DAG... ┌ Warning: [CollectDependentSystemNode]: found symbols in the system headers: [:dispatch_data_t] └ @ Clang.Generators ~/.julia/packages/Clang/uJQ2L/src/generator/passes.jl:95 ERROR: LoadError: There is no definition for dispatch_data_t's underlying type: [``] at /Users/tim/.julia/artifacts/fbb170fa64a06b66dd9a16aaa21bf12848042d9a/aarch64-apple-darwin20/sys-root/usr/include/dispatch/data.h:44:1 Stacktrace: [1] error(s::String) @ Base ./error.jl:35 [2] resolve_dependency!(dag::ExprDAG, node::ExprNode{Clang.Generators.TypedefElaborated, CLTypedefDecl}, options::Dict{String, Any}) @ Clang.Generators ~/.julia/packages/Clang/uJQ2L/src/generator/resolve_deps.jl:99 [3] (::ResolveDependency)(dag::ExprDAG, options::Dict{String, Any}) @ Clang.Generators ~/.julia/packages/Clang/uJQ2L/src/generator/passes.jl:286 [4] build!(ctx::Context, stage::Clang.Generators.BuildStage) @ Clang.Generators ~/.julia/packages/Clang/uJQ2L/src/generator/context.jl:176 [5] wrap(name::String, headers::String; defines::Vector{Any}, include_dirs::Vector{Any}, dependents::Bool) @ Main ~/Julia/pkg/Metal/res/wrap/wrap.jl:27 [6] wrap @ ~/Julia/pkg/Metal/res/wrap/wrap.jl:13 [inlined] [7] main() @ Main ~/Julia/pkg/Metal/res/wrap/wrap.jl:59 [8] top-level scope @ ~/Julia/pkg/Metal/res/wrap/wrap.jl:64 in expression starting at /Users/tim/Julia/pkg/Metal/res/wrap/wrap.jl:64 ``` `data.h:44`: ``` DISPATCH_DATA_DECL(dispatch_data); ``` With the relevant macros for that: ``` #define DISPATCH_GLOBAL_OBJECT(type, object) ((OS_OBJECT_BRIDGE type)&(object)) #define DISPATCH_RETURNS_RETAINED OS_OBJECT_RETURNS_RETAINED #elif defined(__cplusplus) && !defined(__DISPATCH_BUILDING_DISPATCH__) /* * Dispatch objects are NOT C++ objects. Nevertheless, we can at least keep C++ * aware of type compatibility. */ typedef struct dispatch_object_s { private: dispatch_object_s(); ~dispatch_object_s(); dispatch_object_s(const dispatch_object_s &); void operator=(const dispatch_object_s &); } *dispatch_object_t; #define DISPATCH_DECL(name) \ typedef struct name##_s : public dispatch_object_s {} *name##_t #define DISPATCH_DECL_SUBCLASS(name, base) \ typedef struct name##_s : public base##_s {} *name##_t #define DISPATCH_GLOBAL_OBJECT(type, object) (static_cast(&(object))) #define DISPATCH_RETURNS_RETAINED #else /* Plain C */ typedef union { struct _os_object_s *_os_obj; struct dispatch_object_s *_do; struct dispatch_queue_s *_dq; struct dispatch_queue_attr_s *_dqa; struct dispatch_group_s *_dg; struct dispatch_source_s *_ds; struct dispatch_channel_s *_dch; struct dispatch_mach_s *_dm; struct dispatch_mach_msg_s *_dmsg; struct dispatch_semaphore_s *_dsema; struct dispatch_data_s *_ddata; struct dispatch_io_s *_dchannel; } dispatch_object_t DISPATCH_TRANSPARENT_UNION; #define DISPATCH_DECL(name) typedef struct name##_s *name##_t #define DISPATCH_DECL_SUBCLASS(name, base) typedef base##_t name##_t #define DISPATCH_GLOBAL_OBJECT(type, object) ((type)&(object)) #define DISPATCH_RETURNS_RETAINED #endif #if OS_OBJECT_SWIFT3 && OS_OBJECT_USE_OBJC #define DISPATCH_SOURCE_TYPE_DECL(name) \ DISPATCH_EXPORT struct dispatch_source_type_s \ _dispatch_source_type_##name; \ OS_OBJECT_DECL_PROTOCOL(dispatch_source_##name, ); \ OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL( \ dispatch_source, dispatch_source_##name) #define DISPATCH_SOURCE_DECL(name) \ DISPATCH_DECL(name); \ OS_OBJECT_DECL_PROTOCOL(name, ); \ OS_OBJECT_CLASS_IMPLEMENTS_PROTOCOL(name, name) #ifndef DISPATCH_DATA_DECL #define DISPATCH_DATA_DECL(name) OS_OBJECT_DECL_SWIFT(name) #endif // DISPATCH_DATA_DECL #else #define DISPATCH_SOURCE_DECL(name) \ DISPATCH_DECL(name); #define DISPATCH_DATA_DECL(name) DISPATCH_DECL(name) #define DISPATCH_SOURCE_TYPE_DECL(name) \ DISPATCH_EXPORT const struct dispatch_source_type_s \ _dispatch_source_type_##name #endif ``` Is this a known issue, or should I try to reduce the source code involved?