# Alternatives to BinaryBuilder.jl?

**URL:** <https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569>\
**Category:** Package Management\
**Tags:** binarybuilder\
**Created:** [April 5, 2026, 11:41am UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569 "2026-04-05T11:41:14Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [April 5, 2026, 11:41am UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/1 "2026-04-05T11:41:14Z")

</div>

I’m making a wrapper for SimpleBLE in Julia and I can’t get it to build targeting windows in BinaryBuilder.jl I suspect because `Mingw_jll` is too old.

As a result I’ve written the package using pre-built binaries using `@ccall` and it works pretty well as far as I can tell. [SimpleBLE.jl](https://github.com/AwesomeQuest/SimpleBLE.jl/tree/main)

But when I try to ship it with a local registry to another computer I get an `access denied error` because the `.julia/packages` directory has special permissions.

So my question is: Is there a recommended way to ship a package with pre-built binaries that is not BinaryBuilder.jl?

This post is also me **begging** for help with building SimpleBLE for windows (I got it working for Linux, [see this post](https://github.com/JuliaPackaging/BinaryBuilder.jl/issues/1422#issuecomment-4188043105), but I don’t use Linux). I’ve opened an [issue on Yggdrasil](https://github.com/JuliaPackaging/Yggdrasil/issues/13445#issue-4207244132) for updating MinGW but I just don’t know enough.

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [April 6, 2026, 2:02pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/2 "2026-04-06T14:02:04Z")

</div>

I’ve found something that seems to work.

Copy the dlls into a named directory inside `tempdir()` load it with `Libc.Libdl.dlopen` and then delete the copies.

This must be done inside of the ` __init__ ` function of the module to make sure that the library is loaded when the module is.

The directory must be named and made with `mkdir` because otherwise Julia complains at exit that it can’t delete the tempdir, probably because julia makes temporary copies of the dlls for it self and doesn’t delete them before tempdir clean up.

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [April 6, 2026, 2:23pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/3 "2026-04-06T14:23:00Z")

</div>

Even if you’re not using Yggdrasil, I’d strongly advise you to use Artifacts. Instead of putting the hand-built DLLs into the git repository itself, you can put them into a GitHub release asset akin to how BB/Yggdrasil do it. Or ArtifactUtils.jl will help you stash them into Gists.

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [April 6, 2026, 3:07pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/4 "2026-04-06T15:07:10Z")

</div>

That would be perfect but I get an `access denied` error when I try to load the library while it is inside the artifacts directory.

Though I will do this to download them.

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [April 6, 2026, 3:56pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/5 "2026-04-06T15:56:18Z")

</div>

That is true about how `Pkg` adds packages, but it’s not the case for artifacts. They are built for this very use case and should preserve the permissions within the tarball.

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [April 6, 2026, 4:02pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/6 "2026-04-06T16:02:06Z")

</div>

Could you give an example of how to save the files? I just followed [this example](https://github.com/simpleble/simpleble/releases/download/v0.12.1) and did the following

```julia-auto
using Pkg.Artifacts
using ZipArchives

artifact_toml = joinpath(@ __DIR__ , "..", "Artifacts.toml")

win_simplecble_hash = artifact_hash("win_simplecble", artifact_toml)

if win_simplecble_hash === nothing || !artifact_exists(win_simplecble_hash)
	win_simplecble_hash = create_artifact() do artifact_dir
		simplebleurl = "https://github.com/simpleble/simpleble/releases/download/v0.12.1/libsimplecble_windows-x64.zip"
		archive = ZipReader(read(download(simplebleurl)))
		write(joinpath(artifact_dir, "simpleble.dll"), zip_readentry(archive, "shared/bin/simpleble.dll"))
		write(joinpath(artifact_dir, "simplecble.dll"), zip_readentry(archive, "shared/bin/simplecble.dll"))
	end

	bind_artifact!(artifact_toml, "win_simplecble", win_simplecble_hash)
end

win_dll_dir = artifact_path(win_simplecble_hash)

```

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [April 6, 2026, 4:10pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/7 "2026-04-06T16:10:22Z")

</div>

You could take a page from some other recipes that have failed to build for Windows and fall back to an upstream-provided built product.

E.g,

> <https://github.com/JuliaPackaging/Yggdrasil/blob/f0718b91e1ecc7f3070dedcce94b95b74a089da6/P/p7zip/p7zip%4017.6/build_tarballs.jl#L32-L45>

---

<div class="post-metadata">

**Author:** ![nhz2](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nhz2/32/44428_2.png) [@nhz2](https://discourse.julialang.org/u/nhz2)\
**Post date:** [April 6, 2026, 5:12pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/8 "2026-04-06T17:12:47Z")

</div>

I think it mostly works if you create the artifact on a Unix like file system, but if you use Windows to create the artifact, the permissions may be handle a bit strangely. XRef: [https://github.com/JuliaLang/julia/issues/52272#issuecomment-2088920511](https://github.com/JuliaLang/julia/issues/52272#issuecomment-2088920511) and [Use WSL style NTFS extended attributes to store permissions of extracted artifacts on Windows · Issue #2677 · JuliaLang/Pkg.jl · GitHub](https://github.com/JuliaLang/Pkg.jl/issues/2677)

---

<div class="post-metadata">

**Author:** ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)\
**Post date:** [April 6, 2026, 7:22pm UTC](https://discourse.julialang.org/t/alternatives-to-binarybuilder-jl/136569/9 "2026-04-06T19:22:26Z")

</div>

Huzza! [SimpleBLE\_jll](https://github.com/AwesomeQuest/SimpleBLE_jll) [build\_tarbals.jl](https://github.com/JuliaPackaging/Yggdrasil/pull/13451#issue-4213390884)
