You could indeed have BinDeps generate the wrapper for you, using Clang. But that will require the user to have a full-blown development environment installed.
VideoIO is one project I know of that is taking multiple library versions very seriously. --Tim On Sunday, November 16, 2014 03:41:11 PM Erik Schnetter wrote: > I see. > > I was afraid that the C structs may change in between different > versions of the library. If the structs are re-analyzed when the > wrapper is installed, this would not be an issue. > > -erik > > On Sun, Nov 16, 2014 at 2:58 PM, Tim Holy <[email protected]> wrote: > > The only person who needs to use Clang.jl is the package developer. Clang > > writes *.jl files that save you the trouble of keyboarding all the julia > > equivalents of the C structs. It also generates the ccall wrappers. You > > then write your package on top of those generated files. Clang is > > therefore only a dependency for the developer, not for the user. That > > said, if you've already written all your types, Clang won't provide you > > with much benefit. > > > > Quite a few packages use Clang, but one I've been involved with is > > CUDArt.jl. > > > > --Tim > > > > On Sunday, November 16, 2014 01:01:42 PM Erik Schnetter wrote: > >> Thanks for all the pointers! Things are now working fine without > >> wrapper functions but with 120 lines of immutable type declarations. > >> Clang.jl sounds interesting, but would probably make hwloc.jl too > >> difficult to use if it is a prerequisite. Let's see how often the > >> structs of hwloc change with future versions. > >> > >> hwloc is a portable library that determines the number of cores (and > >> many other properties) of the local machine: see > >> <https://github.com/eschnett/hwloc.jl>. > >> > >> -erik > >> > >> On Sun, Nov 16, 2014 at 12:41 PM, Jake Bolewski <[email protected]> > > > > wrote: > >> > No need to flatten if everything is immutable. This file has some > >> > examples > >> > of wrapping structs of structs > >> > https://github.com/jakebolewski/LibGit2.jl/blob/cac78b5c03531b5afbcb0ae > >> > 042 > >> > 538dd351527752/src/types.jl#L19.> > >> > > >> > On Sunday, November 16, 2014 12:33:39 PM UTC-5, Tim Holy wrote: > >> >> AFAIK no need to flatten. > >> >> > >> >> Since Isaiah didn't advertise it himself, I'll mention his Clang.jl > >> >> package, > >> >> which I've found to be a big help in such situations. It's just > >> >> possible > >> >> you > >> >> may not need any C glue code. > >> >> > >> >> --Tim > >> >> > >> >> On Sunday, November 16, 2014 12:15:50 PM Erik Schnetter wrote: > >> >> > Thanks for the pointers on immutable types. > >> >> > > >> >> > Is it possible to access structs inside structs this way? That a > >> >> > struct inside a struct, not a pointer inside a struct. Is an > >> >> > immutable > >> >> > type again a bits type? Or do I need to flatten the structs to make > >> >> > this work? > >> >> > > >> >> > -erik > >> >> > > >> >> > On Sun, Nov 16, 2014 at 11:16 AM, Isaiah Norton > >> >> > <[email protected]> > >> >> > >> >> wrote: > >> >> > >> The library defines some C structs that are part of the API. My > >> >> > >> current approach uses wrapper C functions to access struct > >> >> > >> elements. > >> >> > >> Is there a better way? > >> >> > > > >> >> > > It depends how complicated are the structs. Structs can often be > >> >> > > reflected > >> >> > > as Julia types, as long as isbits(TypeName) == true, and accessed > >> >> > > with > >> >> > > unsafe_load (see for example PyCall's definitions of PyObject_*). > >> >> > > Some > >> >> > > tricky spots include fixed-size arrays and unions (strictly > >> >> > > speaking > >> >> > > you > >> >> > > can make an aggregate element having the maximal size in the > >> >> > > union, > >> >> > > and > >> >> > > then do bitshifts manually. but there is no automatic support). > >> >> > > > >> >> > > There is also the StrPack.jl package, which calculates the > >> >> > > appropriate > >> >> > > memory layout for a given struct and provides > >> >> > > serialization/deserialization.> > >> >> > > > >> >> > >> I thus I need to build this wrapper file as well. I created a > >> >> > >> SimpleBuild rule for this. However, I need to know the path where > >> >> > >> BinDeps installed (or found) the header files so that I can > >> >> > >> compile > >> >> > >> this file. How do I access this information? > >> >> > > > >> >> > > This is going to be package-manager and build-tool specific, and I > >> >> > > don't > >> >> > > know if there is any abstraction/helper for includes in BinDeps > >> >> > > yet. > >> >> > > > >> >> > > On Sun, Nov 16, 2014 at 10:09 AM, Erik Schnetter > >> >> > > <[email protected]> > >> >> > > > >> >> > > wrote: > >> >> > >> I want to wrap a library (hwloc) for Julia. This is working fine. > >> >> > >> > >> >> > >> The library defines some C structs that are part of the API. My > >> >> > >> current approach uses wrapper C functions to access struct > >> >> > >> elements. > >> >> > >> Is there a better way? > >> >> > >> > >> >> > >> I thus I need to build this wrapper file as well. I created a > >> >> > >> SimpleBuild rule for this. However, I need to know the path where > >> >> > >> BinDeps installed (or found) the header files so that I can > >> >> > >> compile > >> >> > >> this file. How do I access this information? > >> >> > >> > >> >> > >> -erik > >> >> > >> > >> >> > >> -- > >> >> > >> Erik Schnetter <[email protected]> > >> >> > >> http://www.perimeterinstitute.ca/personal/eschnetter/
