I've managed to get it working without msys.dll now. One unfortunately problem is that Flint relies on pthreads and gcc introduces a dependency on libwin-pthreads1.dll, so I have to distribute this dll also with my project. I've already looked online and there seems to be no way to get around this. There's a lot of people scratching their heads about this one online. The msys developers usually suggest that people compile their libraries with -static. But I'm not sure that is a solution is this case.
Anyway, it's not a major problem. Bill. On 15 September 2015 at 04:35, Tony Kelman <t...@kelman.net> wrote: > Yes, though the 32-bit version of i686-w64-mingw32-gcc available via > pacman uses a different exception-handling format than the toolchain we use > to build Julia, so there's another potential source of incompatibility if > you're also providing 32-bit binaries. For 64 bit it should be compatible, > hopefully. You can refer to > https://github.com/JuliaLang/julia/blob/master/README.windows.md#compiling-with-mingwmsys2, > specifically the contrib/windows/get_toolchain.sh script to obtain a > toolchain with the highest likelihood of being compatible with Julia > binaries. Or you can cross-compile from Cygwin, but sounds like the build > systems of the libraries you're building can't handle that. > > > On Monday, September 14, 2015 at 7:27:55 PM UTC-7, Bill Hart wrote: >> >> I simply used the "MinGW-w64 Win64 shell" that msys2 provides. Is that >> not the correct thing? >> >> If not, where do I obtain the correct gcc? Is it for example available >> via pacman in msys2? >> >> Bill. >> >> On 15 September 2015 at 04:20, Tony Kelman <to...@kelman.net> wrote: >> >>> If your libraries depend on msys-2.0.dll, you're using the wrong gcc, >>> and the resulting libraries are unlikely to work with Julia (they might, if >>> you get lucky, but I wouldn't count on it). This is essentially the same as >>> if you built gmp in cygwin. If you use the MinGW-w64 version of gcc, then >>> your libgmp will depend on msvcrt.dll instead of msys-2.0.dll. >>> >>> >>> On Monday, September 14, 2015 at 7:11:02 PM UTC-7, Bill Hart wrote: >>>> >>>> Thanks Jameson. depends22.exe gave the required hint. >>>> >>>> Apparently msys2 makes gmp (and everything else) depend on >>>> msys-2.0.dll. Who knows why it does that. I thought the entire point of >>>> msys was to create native, standalone Windows applications. >>>> >>>> I can now access the dll's. >>>> >>>> I imagine it will be enough for me to simply supply the dll's I need, >>>> plus msys-2.0.dll for download somewhere, unless I can find some magic >>>> invocation which builds msys-2.0.dll into the other dlls I'm building. >>>> >>>> Bill. >>>> >>>> On 15 September 2015 at 03:58, Jameson Nash <vtj...@gmail.com> wrote: >>>> >>>>> You can use a program called depends22.exe to check whether it has any >>>>> odd dependencies. Then try calling just >>>>> `dlopen("C:\\absolute\\path\\to\\lib.dll")` and see whether that works. >>>>> ccall uses the same underlying dlopen call, so once you get it working for >>>>> one, it should work for both. >>>>> >>>>> On Mon, Sep 14, 2015 at 9:55 PM 'Bill Hart' via julia-users < >>>>> julia...@googlegroups.com> wrote: >>>>> >>>>>> I tried two different dll's with absolute paths, built with recent >>>>>> MinGW64 and Julia's ccall does not work for either. It still says, "The >>>>>> specified module could not be found". >>>>>> >>>>>> The file type is "gmp-6.0.0/.libs/libgmp-10.dll: PE32+ executable >>>>>> (DLL) (console) x86-64, for MS Windows" and it is just GMP, so it has no >>>>>> external dependencies. >>>>>> >>>>>> I have verified that a simple program will link against the dll and >>>>>> run within msys2/MinGW64. So the dll is certainly built correctly. >>>>>> >>>>>> I realise Julia already supplies its own GMP, I'm just using this as >>>>>> a test case because I know there are no other dependencies. The result is >>>>>> the same with libpari.dll, which Julia does not provide. >>>>>> >>>>>> Needless to say I am using the latest Julia 0.4 release candidate. >>>>>> >>>>>> Bill. >>>>>> >>>>>> On 15 September 2015 at 03:42, Tony Kelman <to...@kelman.net> wrote: >>>>>> >>>>>>> You can refer to the path to a library in ccall via a const >>>>>>> variable. BinDeps helps with setting that variable's value based on the >>>>>>> user-dependent install path, so everything is relocatable. You can get >>>>>>> by >>>>>>> without BinDeps if you'd like, it's not without its flaws. Here's an >>>>>>> example from Blosc.jl that barely uses BinDeps, only for the purposes of >>>>>>> download_cmd and unpack_cmd: >>>>>>> https://github.com/stevengj/Blosc.jl/blob/master/deps/build.jl >>>>>>> >>>>>>> >>>>>>> On Monday, September 14, 2015 at 6:36:56 PM UTC-7, Bill Hart wrote: >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On 15 September 2015 at 02:54, Tony Kelman <to...@kelman.net> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> On second thought ECOS.jl is a simpler example: >>>>>>>>> https://github.com/JuliaOpt/ECOS.jl/blob/master/deps/build.jl >>>>>>>>> >>>>>>>>> Or MbedTLS.jl, very similar but with multiple libraries: >>>>>>>>> https://github.com/JuliaWeb/MbedTLS.jl/blob/master/deps/build.jl >>>>>>>>> >>>>>>>>> >>>>>>>>> On Monday, September 14, 2015 at 5:51:33 PM UTC-7, Tony Kelman >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> All Julia needs is dll's. >>>>>>>>>> >>>>>>>>> >>>>>>>> Great, that halves the number of permutations for me to try. Thanks. >>>>>>>> >>>>>>>> >>>>>>>>> Best to refer to them via absolute paths in ccall. >>>>>>>>>> >>>>>>>>> >>>>>>>> Ouch. We have by now thousands of ccalls. Anyway I'll give it a try. >>>>>>>> >>>>>>>> >>>>>>>>> See how SCS.jl handles these for a simple example: >>>>>>>>>> https://github.com/JuliaOpt/SCS.jl/blob/master/deps/build.jl >>>>>>>>>> >>>>>>>>>> >>>>>>>> Thanks. >>>>>>>> >>>>>>>> >>>>>>>>> Requiring Windows users of your package to have an MSYS >>>>>>>>>> environment and MinGW-w64 toolchain installed on their computers is >>>>>>>>>> asking >>>>>>>>>> for trouble and not at all recommended. >>>>>>>>>> >>>>>>>>> >>>>>>>> I agree, and I'd prefer to avoid it. But we still need to build >>>>>>>> them ourselves. And I do have a working MSYS and MinGW toolchain (not >>>>>>>> without great cost to management of course). >>>>>>>> >>>>>>>> >>>>>>>>> I don't see why any library that you could build on Windows with >>>>>>>>>> MinGW-w64 couldn't build in cross-compilation from the opensuse build >>>>>>>>>> service - generally it's a deficiency in that library's build system >>>>>>>>>> that >>>>>>>>>> should be fixable. Cross-compilation is something that autotools is >>>>>>>>>> very >>>>>>>>>> good at, CMake is decent at if you know what you're doing. Rolling >>>>>>>>>> your own >>>>>>>>>> non-standard build system is asking for trouble, you can see places >>>>>>>>>> where >>>>>>>>>> Julia's own makefiles have gone to extra lengths involving XC_HOST >>>>>>>>>> to make >>>>>>>>>> this possible. >>>>>>>>>> >>>>>>>>> >>>>>>>> Pari is not our package so there's nothing we can do about their >>>>>>>> build system. >>>>>>>> >>>>>>>> Many Open Source projects in our area simply aren't invested in >>>>>>>> Windows and have existed long before autotools was a thing. >>>>>>>> >>>>>>>> Very basic autotools builds have been produced for Flint a few >>>>>>>> times, even recently, but unfortunately autotools is way too slow and >>>>>>>> is >>>>>>>> not able to support a number of the features of our build system that >>>>>>>> we >>>>>>>> rely on. >>>>>>>> >>>>>>>> Autotools gives an approximation that is good enough for some >>>>>>>> simple applications of Flint, but not for us. >>>>>>>> >>>>>>>> >>>>>>>>>> If you have a working build setup from a local Windows machine >>>>>>>>>> that can produce dll's, most of what you need to do is upload those >>>>>>>>>> dll's >>>>>>>>>> somewhere (bintray works fairly well) then set up the BinDeps >>>>>>>>>> scripts to >>>>>>>>>> download and determine the install-time paths. >>>>>>>>>> >>>>>>>>> >>>>>>>> Thanks, I'll look at BinDeps next. >>>>>>>> >>>>>>>> I have dedicated web hosting for the dll's, so that isn't a >>>>>>>> problem. Just getting them running from within Julia will be enough. >>>>>>>> >>>>>>>> Bill. >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Monday, September 14, 2015 at 5:23:12 PM UTC-7, Bill Hart >>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> Hi, >>>>>>>>>>> >>>>>>>>>>> I'm currently up to working on building the dependencies for our >>>>>>>>>>> Nemo computer algebra package for Julia: >>>>>>>>>>> >>>>>>>>>>> https://github.com/wbhart/Nemo.jl >>>>>>>>>>> >>>>>>>>>>> We have dependencies on the following C libraries: >>>>>>>>>>> >>>>>>>>>>> libpari (Pari/GP) >>>>>>>>>>> Antic (https://github.com/wbhart/Antic) >>>>>>>>>>> Flint (https://github.com/wbhart/flint2) >>>>>>>>>>> mpfr >= 3.1.2 >>>>>>>>>>> gmp >= 5.1 >>>>>>>>>>> >>>>>>>>>>> Whatever logic I had already coded up in our build.jl to build >>>>>>>>>>> these on Windows 64 and use them from within Julia no longer works. >>>>>>>>>>> We >>>>>>>>>>> always knew that there were going to be changes in the way things >>>>>>>>>>> worked, >>>>>>>>>>> so this is not unexpected. >>>>>>>>>>> >>>>>>>>>>> So I thought I would take a look at the OpenSUSE build service. >>>>>>>>>>> But flint, pari and antic are not available on there. (I found the >>>>>>>>>>> WebRPM >>>>>>>>>>> package for Julia and have been using that.) >>>>>>>>>>> >>>>>>>>>>> It looks like someone has tried to build flint on there, but >>>>>>>>>>> their system doesn't cope with the flint build system (or vice >>>>>>>>>>> versa if you >>>>>>>>>>> prefer). >>>>>>>>>>> >>>>>>>>>>> Pari only builds on Windows 64 with some coaxing (I have >>>>>>>>>>> succeeded in doing that). It certainly won't build with OpenSUSE. >>>>>>>>>>> >>>>>>>>>>> So this means I have to build these binaries myself perhaps and >>>>>>>>>>> just download them from somewhere on the web, which I'm happy to do. >>>>>>>>>>> >>>>>>>>>>> So I tried building binaries in both msys2 and mingw64. After >>>>>>>>>>> much work I cannot figure out where Julia expects to find the >>>>>>>>>>> binaries. >>>>>>>>>>> I've tried setting PATH and Libdl.LD_LOAD_PATH appropriately. I've >>>>>>>>>>> tried >>>>>>>>>>> static and dynamic libraries, but under no circumstances can I get >>>>>>>>>>> Julia to >>>>>>>>>>> find the libraries. It just says the "module is not found" when >>>>>>>>>>> trying to >>>>>>>>>>> ccall them. >>>>>>>>>>> >>>>>>>>>>> Moreover, OpenSUSE doesn't provide a "make" package, as far as I >>>>>>>>>>> can see. And make is not available from the GitBash shell in Julia >>>>>>>>>>> on >>>>>>>>>>> Windows 64. So even building the software from within Julia >>>>>>>>>>> currently seems >>>>>>>>>>> impossible. >>>>>>>>>>> >>>>>>>>>>> I also had problems with the gcc not wanting to build 64 bit >>>>>>>>>>> binaries. >>>>>>>>>>> >>>>>>>>>>> Given that OpenSUSE appears out of the question for us on >>>>>>>>>>> Windows 64. can anyone shed any light on how to get Julia compatible >>>>>>>>>>> libraries built (msys2, mingw64??) and what the current best >>>>>>>>>>> practice is >>>>>>>>>>> for ccall'ing those binaries (how to set the linker path?). >>>>>>>>>>> >>>>>>>>>>> Note that flint and pari both have custom configure arguments >>>>>>>>>>> that must be set and neither flint nor pari uses autotools, though >>>>>>>>>>> both >>>>>>>>>>> roughly emulate an autotools build with some extra bells and >>>>>>>>>>> whistles. >>>>>>>>>>> >>>>>>>>>>> Any help would be very much appreciated. We have everything >>>>>>>>>>> working beautifully on Linux, but one of the big selling points for >>>>>>>>>>> us is >>>>>>>>>>> that the entire Julia stack works natively on Windows. This is an >>>>>>>>>>> especially big thing for us given that IJulia also works on Windows >>>>>>>>>>> (most >>>>>>>>>>> computer algebra systems do not work on Windows). >>>>>>>>>>> >>>>>>>>>>> Julia is working beautifully for us and we have 40-50,000 lines >>>>>>>>>>> of Julia code locally for our computer algebra package (Nemo + >>>>>>>>>>> Hecke). But >>>>>>>>>>> getting it working on Windows just seems to be outside of my >>>>>>>>>>> current skill >>>>>>>>>>> set. >>>>>>>>>>> >>>>>>>>>>> One other minor question: because we currently need to build the >>>>>>>>>>> libraries ourselves, we have to (or would like to) run configure >>>>>>>>>>> and make, >>>>>>>>>>> etc., from the shell in Julia. This means directories have to be >>>>>>>>>>> converted >>>>>>>>>>> from the C:\\abc\\def style to /c/abc/def/ style. Is there a Julia >>>>>>>>>>> function >>>>>>>>>>> for doing this, or a best practice? >>>>>>>>>>> >>>>>>>>>>> Bill. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>> >>>>>> >>>> >>