# QML.jl release pending

**URL:** <https://discourse.julialang.org/t/qml-jl-release-pending/43758>\
**Category:** Package Announcements\
**Tags:** guis, qt\
**Created:** [July 27, 2020, 12:39pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758 "2020-07-27T12:39:02Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![barche](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/barche/32/79_2.png) [@barche](https://discourse.julialang.org/u/barche)\
**Post date:** [July 27, 2020, 12:39pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/1 "2020-07-27T12:39:02Z")

</div>

Hi everyone,

It has been in the works for a long time, but QML.jl is finally ready for release, with the [registration PR](https://github.com/JuliaRegistries/General/pull/18516) pending. In the mean time, you can test it using:

```julia
add https://github.com/barche/QML.jl.git

```

See the [README](https://github.com/barche/QML.jl) and the [documentation](https://barche.github.io/QML.jl/dev/) (contributed by @bramtayl) for more info.

There is also a [JuliaCon lightning talk about QML.jl](https://live.juliacon.org/talk/3ZTCWX) Thursday. ( See trailer below 😉 )

![qml](https://global.discourse-cdn.com/julialang/original/3X/b/0/b011b155b633df6e7b3c17d4c7c976e7357e54cf.gif)

---

<div class="post-metadata">

**Author:** ![jheinen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jheinen/32/2787_2.png) [@jheinen](https://discourse.julialang.org/u/jheinen)\
**Post date:** [July 27, 2020, 2:10pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/2 "2020-07-27T14:10:47Z")

</div>

Works fine with GR, too ([qml\_ex.jl](https://github.com/jheinen/GR.jl/blob/master/examples/qml_ex.jl)).

![hexbin+qml](https://global.discourse-cdn.com/julialang/original/3X/2/c/2ccc22d7a97b5eb2f4e40fbe2cddc71a0b6f9f1f.gif)

Thanks a lot, Bart!

---

<div class="post-metadata">

**Author:** ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)\
**Post date:** [July 27, 2020, 5:18pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/3 "2020-07-27T17:18:57Z")

</div>

Great job!

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 28, 2020, 12:30am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/4 "2020-11-28T00:30:06Z")

</div>

@barche Thanks for this repo. Does this work on arm64 as is or I will have to fiddle a bit. It worked on x86 directly but on arm64 currently I have this “UndefVarError: libjlqml not defined” errror. I tried jlqml building; it fails too.

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 28, 2020, 1:05am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/5 "2020-11-28T01:05:23Z")

</div>

Qt version could be reason. I was using 5.12. Default qt on my system failed first. I tried fetching newer version 5.12. Any suggestions here ? Thanks for your time. OS: Ubuntu 18.04 and aarch64 platform.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [November 28, 2020, 1:36am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/6 "2020-11-28T01:36:13Z")

</div>

What version of `Qt_jll` do you have?

```julia
]status -m Qt_jll

```

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 28, 2020, 1:51am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/7 "2020-11-28T01:51:53Z")

</div>

Thanks for looking into this 5.15.1+0  
[ede63266] Qt\_jll v5.15.1+0

[edit] Thanks this gives me a hint to use qt 5.15 instead for building jlqml.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [November 28, 2020, 1:59am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/8 "2020-11-28T01:59:27Z")

</div>

This version of `Qt_jll` should support your platform

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 28, 2020, 2:01am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/9 "2020-11-28T02:01:17Z")

</div>

Current error trace is something like this:

ERROR: LoadError: UndefVarError: libjlqml not defined  
Stacktrace:  
[1] top-level scope at /home/xxx/.julia/packages/QML/AvdBY/src/QML.jl:30  
[2] include(::Function, ::Module, ::String) at ./Base.jl:380  
[3] include(::Module, ::String) at ./Base.jl:368  
[4] top-level scope at none:2  
[5] eval at ./boot.jl:331 [inlined]  
[6] eval(::Expr) at ./client.jl:467  
[7] top-level scope at ./none:3  
in expression starting at /home/xxx/.julia/packages/QML/AvdBY/src/QML.jl:30  
ERROR: Failed to precompile QML [2db162a6-7e43-52c3-8d84-290c1c42d82a] to /home/xxx/.julia/compiled/v1.5/QML/JLkMo\_W3O9X.ji.  
Stacktrace:  
[1] error(::String) at ./error.jl:33  
[2] compilecache(::Base.PkgId, ::String) at ./loading.jl:1305  
[3] \_require(::Base.PkgId) at ./loading.jl:1030  
[4] require(::Base.PkgId) at ./loading.jl:928  
[5] require(::Module, ::Symbol) at ./loading.jl:923

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 28, 2020, 2:06am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/10 "2020-11-28T02:06:48Z")

</div>

I will launch a new thread. I feel I am polluting this.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [November 28, 2020, 2:45am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/11 "2020-11-28T02:45:38Z")

</div>

Oh, right, sorry, the missing library is `libjlqml`, not any of Qt

---

<div class="post-metadata">

**Author:** ![barche](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/barche/32/79_2.png) [@barche](https://discourse.julialang.org/u/barche)\
**Post date:** [November 29, 2020, 1:29pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/12 "2020-11-29T13:29:22Z")

</div>

> [@arhik](#):
>
> Does this work on arm64 as is or I will have to fiddle a bit.

For now, you would still have to build the jlqml library yourself. Very soon now ™ we should have official bianries, though. You can track progress here, we just had a bit of setback with libcxxwrap-julia (a dependency for jlqml).

> <https://github.com/JuliaPackaging/Yggdrasil/issues/2160>
>
> Once we have versions of \`libcxxwrap\_julia\_jll\` for all Julia versions, we'll ne…ed to update the various JLLs using it to also provide multiple versions. Here I try to describe what's going on and why a change is needed; explain how to make that change; and track the progress of each affected package.
> 
> \## What's going on
> 
> Julia does not currently provide a stable ABI, meaning that things that were compiled against, say, Julia 1.3, may or may not work when linked at runtime against Julia 1.4/1.5/... -- and this holds of course for any combination of Julia versions. For libcxxwrap and anything using its headers (including all (?) JLLs using \`Dependency("libcxxwrap\_julia\_jll")\`), it is indeed a fact that a binary compiled against Julia 1.3 can lead to segfaults during GC when used with any later Julia version, and vice versa. Right now it is not definitely known whether other Julia combinations can lead to issues, but it is not unlikely that this will eventually happen.
> 
> Thus the only safe way forward is to provide binaries for \`libcxxwrap\_julia\_jll\` which are compiled against each of Julia 1.3, 1.4, 1.5, ....
> 
> In an ideal world, the julia version would simply be part of the \`Platform\`, and we'd be done. Indeed, @staticfloat added support for that -- alas, it will only work in Julia \>= 1.6; older versions will balk when they see such platform identifiers. So as long as one wants to support any older Julia versions (which I'd expect to be everybody right now, as 1.6 has not yet been released, not even branched), extra work is needed.
> 
> On the upside to all this, cxxwrap now supports many more platforms, which you can potentially benefit from for your own JLLs, too!
> 
> \## How to deal with it
> 
> \*\*The following is an initial suggestion, and will be revised based on feedback; I suggest that people wait a bit with trying to implement this, until we've ironed out everything\*\*
> 
> In a nutshell, here's the plan: for each affected JLL, we build it several times, once for each supported Julia minor version (so e.g. one each for Julia 1.3, 1.4 and 1.5+), but built from the same source. For technical reasons, each such build will have to carry a separate version. The convention I propose is to set the patch level of your JLL to the minor version of Julia (so \`libcxxwrap\_julia\_jll\` 0.8.4 was built against Julia 1.4). Yes, that means you can't have a one-to-one mapping with the actual versions of the code your JLL wraps; but the longterm plan for JLLs is to completely decouple JLL versions from the versions of the wrapped software anyway.
> 
> There are many ways to deal with this; I'll describe one of them here, which I am using in PR #1798. The core idea is to rename your current \`build\_tarballs.jl\` to \`common.jl\` and then add one subdir for each supported Julia version, each with a \`build\_tarballs.jl\` including \`common.jl\`. 
> 
> For example, PR #1798 renames \`L/libsingular\_julia/build\_tarballs.jl\` to \`L/libsingular\_julia/common.jl\` and adds \`L/libsingular\_julia/libsingular\_julia@1.3/build\_tarballs.jl\` which looks like this:
> \`\`\`julia
> const julia\_version = v"1.3.1"
> include("../common.jl")
> \`\`\`
> For technical reasons, the \`build\_tarballs.jl\` for Julia 1.4 and 1.5 will be added in later PRs (AFAIK Yggdrasil tooling does not allow adding multiple versions of a JLL in a single PR -- so far that would have been a weird thing to do anyway).
> 
> In \`common.jl\`, some changes are made:
> \- the \`version\` is adjusted to set the patchlevel to match the Julia minor version: \`version = VersionNumber(0, 2, julia\_version.minor)\`
> \- the list of platforms is expanded to match the platforms supported by \`libcxxwrap\_julia\_jll\` (this could be neater, see also https://github.com/JuliaPackaging/BinaryBuilder.jl/issues/957)
> \- the dependencies are adjusted:
> - instead of \`Julia\_jll\`, we now need \`libjulia\_jll\` in the right version:
> \`BuildDependency(PackageSpec(name="libjulia\_jll", version=julia\_version)),\`
> - we inform \`build\_tarballs\` about the runtime Julia requirements, by adding this keyword argument:
> \`julia\_compat = "$(julia\_version.major).$(julia\_version.minor)"\`
> Note that this is not using \`~\` as one might expect, simply so that the build for Julia 1.5 can be used with Julia 1.6 until a \`libjulia\_jll\` for 1.6 exists (yes, that might not work, due to ABI incompatibilities; but at least it has a chance of working, which is better than what we'd have if we used \`~\` in the version specification. Technically this means one could also use the JLL version made for Julia 1.3 in Julia 1.4; but since the JLL version for Julia 1.4 is strictly newer than that for Julia 1.3, this shouldn't happen unless a user forces that, and well, then they deserve it...
> 
> UPDATE: we also recommend that all packages using \`libcxxwrap\_julia\_jl\` should use \`preferred\_gcc\_version=v"8"\` or higher; see https://github.com/JuliaPackaging/Yggdrasil/pull/2236 and https://github.com/JuliaInterop/libcxxwrap-julia/issues/75
> 
> 
> \## Affected JLLs and their status
> 
> Note: I plan to ping the respective authors once we have a stable plan, but for now, it seems premature to bother them. In particular until PR #2158 is ready...
> 
> \- \[\] \`ConnectFourSolver\` -- @findmyway
> - \[\] Julia 1.3
> - \[\] Julia 1.4
> - \[x\] Julia 1.5 -- PR #2323
> \- \[x\] \`FastJet\_Julia\_Wrapper\` -- @jstrube 
> - \[x\] \<s\>Julia 1.3\</s\>
> - \[x\] \<s\>Julia 1.4\</s\>
> - \[x\] Julia 1.5 -- PR #2180
> \- \[\] \`HelFEM\` -- @mortenpi
> - \[\] Julia 1.3
> - \[\] Julia 1.4
> - \[x\] Julia 1.5 -- PR #2320
> \- \[x\] \`LCIO\_Julia\_Wrapper\` -- @jstrube 
> - \[x\] \<s\>Julia 1.3\</s\>
> - \[x\] \<s\>Julia 1.4\</s\>
> - \[x\] Julia 1.5 -- PR #2181 
> \- \[\] \`OpenSpiel\` -- @findmyway
> - \[\] Julia 1.3
> - \[\] Julia 1.4
> - \[\] Julia 1.5 -- PR #2325 
> \- \[\] \`SDPA\` -- @ViralBShah 
> - \[\] Julia 1.3
> - \[\] Julia 1.4
> - \[x\] Julia 1.5 -- PR #2327 
> \- \[\] \`jlqml\` -- @barche 
> - \[\] Julia 1.3
> - \[\] Julia 1.4
> - \[x\] Julia 1.5 -- PR #2324 
> \- \[\] \`libcgal\_julia\` -- @rgcv 
> - \[x\] Julia 1.3 -- PR #2333
> - \[\] Julia 1.4
> - \[\] Julia 1.5 -- \<s\>PR #2326\</s\>
> \- \[x\] \`libcxxwrap\_julia\`
> - \[x\] Julia 1.3 -- PR #1948, #2150
> - \[x\] Julia 1.4 -- PR #2106
> - \[x\] Julia 1.5 -- PR #2158
> \- \[x\] \`libpolymake\_julia\` -- @benlorenz
> - \[x\] Julia 1.3 -- PR #2306
> - \[x\] Julia 1.4 -- PR #2313
> - \[x\] Julia 1.5 -- PR #2316
> \- \[x\] \`libsingular\_julia\` -- @fingolfin 
> - \[x\] Julia 1.3 -- PR #1798, #2300
> - \[x\] Julia 1.4 -- PR #2263
> - \[x\] Julia 1.5 -- PR #2303
> \- \[\] \`z3\` -- @ahumenberger 
> - \[\] Julia 1.3
> - \[\] Julia 1.4
> - \[\] Julia 1.5 -- PR #2321

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 30, 2020, 9:21am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/13 "2020-11-30T09:21:23Z")

</div>

Thanks. I managed to built it and I followed instruments of jlqml repo (overrides.toml). The library doesn’t pick the libjlqml.so still. I feel jlqml\_jll needs aarch64 specific script in src folder.

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [November 30, 2020, 2:41pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/14 "2020-11-30T14:41:34Z")

</div>

Had to add aarch64 wrapper script (just a copy of arm-linux). I made an [aarch64 fork](https://github.com/arhik/jlqml_jll.jl.git) here. But I have a general question. How do you get git-tree-sha1 value. In my case I just replaced with expected value in error.

---

<div class="post-metadata">

**Author:** ![barche](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/barche/32/79_2.png) [@barche](https://discourse.julialang.org/u/barche)\
**Post date:** [November 30, 2020, 3:33pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/15 "2020-11-30T15:33:48Z")

</div>

You should be able to add an entry to your `~/.julia/artifacts/Overrides.toml` like this:

```nohighlight
[6b5019fb-a83d-5b4e-a9f7-678a36c28df7]
jlqml = "/home/user/src/build/jlqml"

[ede63266-ebff-546c-83e0-1c6fb6d0efc8]
Qt = "/usr"

```

The directories passed here need to contain a directory `lib` that holds the actual libraries. Note that it’s best to also override Qt to the Qt you used to compile jlqml.

---

<div class="post-metadata">

**Author:** ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)\
**Post date:** [November 30, 2020, 4:30pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/16 "2020-11-30T16:30:38Z")

</div>

Note that this is also documented in the [JLL packages](https://juliapackaging.github.io/BinaryBuilder.jl/dev/jll/#Non-dev'ed-JLL-packages) section of BinaryBuilder docs

---

<div class="post-metadata">

**Author:** ![arhik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/arhik/32/8991_2.png) [@arhik](https://discourse.julialang.org/u/arhik)\
**Post date:** [December 1, 2020, 7:07am UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/17 "2020-12-01T07:07:58Z")

</div>

@barche Yes. I agree it should work because the changes I made look trivial but as I mentioned I followed instructions in jlqml. It didn’t work. I am not sure why. May be its my system in some stale state is the problem. Thanks for this work. It works well so far.

---

<div class="post-metadata">

**Author:** ![barche](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/barche/32/79_2.png) [@barche](https://discourse.julialang.org/u/barche)\
**Post date:** [December 1, 2020, 10:52pm UTC](https://discourse.julialang.org/t/qml-jl-release-pending/43758/18 "2020-12-01T22:52:02Z")

</div>

Ah, I think I understand now, probably the override doesn’t work because the aarch64 architecture is not present at all in the JLL. The only way I can think of to do that is to check out the Yggdrasil tree, add aarch64 to the build\_tarballs.jl for jlqml and then build using `--deploy` to your own github fork of the jlqml JLL package.
