Ainda estou esperando por uma resposta melhor de alguém que conheça uma maneira mais idiomática de realizar isso, mas caso não haja uma, para o benefício dos futuros googlers, aqui está o que fiz para obtê-la trabalhando por enquanto:
Na minha instalação do Linux Mint, copiei /usr/lib/cli/binfmt-detector-cli
. Este arquivo é fornecido pelo pacote Ubuntu mono-runtime . Eu não gosto de pegar um executável de outra distro, mas deve ser um executável razoavelmente simples que não dependa de muito que possa diferir entre distros diferentes, desde que sejam a mesma plataforma.
Este é um comando simples que testa se um arquivo é um executável da CLI, retornando 0
ou 1
na saída para indicar sim ou não.
A instalação do My Manjaro não tem o diretório /usr/lib/cli
, então copiei esse arquivo diretamente para /usr/bin/
. Em seguida, um escreveu um script de shell curto e salvou-o como /usr/bin/binfmt-mono-wine
:
#!/bin/bash
if /usr/bin/binfmt-detector-cli "$1"; then
mono "$@"
else
wine "$@"
fi
Em seguida, editei /usr/lib/binfmt.d/mono.conf
, alterando
:CLR:M::MZ::/usr/bin/mono:
para
:CLR:M::MZ::/usr/bin/binfmt-mono-wine:
e /usr/lib/binfmt.d/wine.conf
, mudando
:DOSWin:M::MZ::/usr/bin/wine:
para
:DOSWin:M::MZ::/usr/bin/binfmt-mono-wine:
Você pode ver que ambos os formatos agora são manipulados pelo shell script, que usa o detector emprestado do Ubuntu para determinar qual comando iniciar.
Em seguida, tive de cancelar o registro dos antigos manipuladores e registrar os novos. Descobri que o systemd tem um serviço que faz isso:
sudo /usr/lib/systemd/systemd-binfmt mono.conf
sudo /usr/lib/systemd/systemd-binfmt wine.conf
A última coisa a fazer é registrar um gancho pacman para que futuros upgrades para mono e wine não substituam minhas alterações para suas configurações binfmt. Eu criei /etc/pacman.d/hooks/binfmt-mono-wine.hook
com estes conteúdos:
[Trigger]
Operation = Install
Operation = Upgrade
Type = File
Target = usr/lib/binfmt.d/mono.conf
Target = usr/lib/binfmt.d/wine.conf
[Action]
When = PostTransaction
Description = Updating binfmt configuration to use binfmt-mono-wine to differentiate between mono and wine executables
Exec = /usr/bin/xargs -I{} /usr/bin/sed -Ei 's_:/usr/bin/(mono|wine):_:/usr/bin/binfmt-mono-wine:_' /{}
NeedsTargets