Moritz Maxeiner wrote: > On Saturday, 23 March 2013 at 21:24:50 UTC, Jens Mueller wrote: > >Moritz Maxeiner wrote: > >>On Saturday, 23 March 2013 at 16:37:35 UTC, Jens Mueller wrote: > >>>Moritz Maxeiner wrote: > >>>>On Saturday, 23 March 2013 at 10:31:30 UTC, Jens Mueller > >>>>wrote: > >>>> > >>>>It looks mostly okay to me with one problem: Afaict the code > >>>>enforces the presence of the initialization routines of all > >>>>targets, > >>>>e.g. if one target is missing LLVMInitializeAllTargets will > >>>>not > >>>>link, as there are undefined references for that missing > >>>>target, > >>>>but > >>>>LLVM may or may not be compiled with that target so you > >>>>cannot > >>>>enforce its presence in the bindings. For runtime loading the > >>>>solution I used was to check the function pointer for null; > >>>>for > >>>>linking you have this problem: When using linking, knowing > >>>>which > >>>>targets are available happens at link time (when the LLVM > >>>>libraries > >>>>are linked in), which means you cannot use any compile time > >>>>tricks > >>>>for automatic detection of which targets are available. > >>>>The only solution for that problem I can think of would be to > >>>>use > >>>>runtime reflection and check at runtime for each > >>>>initialiation > >>>>routine if it is a callable function, but afaik D only has > >>>>compile > >>>>time reflection. > >>> > >>>I wonder how they do it in C. Don't you have to set a macro? > >> > >>Afaict they rely on the fact that when you install llvm on your > >>system you get the {/usr/include/}llvm/Config/Targets.def file, > >>in > >>which is set what targets LLVM was compiled with (it gets > >>generated > >>at LLVM compile-time). Then the Target.h, in which the > >>LLVMInitializeAllTargets function rests, includes that file and > >>does > >>some of that macro-voodoo that makes C/C++ so "lovable" to only > >>create calls for the targets enabled in the Targets.def file > >>when > >>LLVMInitalizeAllTargets gets inlined. Of course, that solution > >>isn't > >>viable because afaik you cannot access filesystem IO functions > >>in D > >>CTFE, meaning the Targets.def file is useless to you. > >><rant>Hooray > >>for the C/C++ preprocessor, may it die, die, die!</rant> > > > >If I knew the path to the Targets.def file at compile I could load > >its > >contents and use it. > >http://dlang.org/expression.html#ImportExpression > >Still have to find out how to get the path. > > > >Jens > > Oh, I did not know that was possible, thanks for the link! > Can't really help you with the path, though. On Linux it's probably > either /usr/include/llvm/Config/Targets.def or > /usr/local/include/llvm/Config/Targets.def, but some people might > install it on /opt/llvm or other custom paths. You also have a > problem when there's only a shared lib available for LLVM and no > headers.. No idea about OSX though. And on Windows you'll probably > only deal with a DLL and not have the headers available anyway - at > least I do (I cross compile the LLVM dll on linux with a mingw64 gcc > toolchain, so no headers on windows for me).
I think passing the path -J should work. But I don't know what to do when there is no Targets.def. Jens