2016-03-02 2 views
3

Je souhaite inclure un fichier exécutable dans la section cabal data-files pour l'exécuter en tant que sous-processus dans mon programme Haskell.Cabal: fichiers de données exécutables

Le fichier est là, getDataFileName fonctionne pour cela, mais il lui manque le bit exécutable et donc essayer de l'exécuter avec System.Process.createProcess échoue avec permission denied.

Existe-t-il un moyen pour que cabal conserve l'autorisation d'exécution du fichier? Y a-t-il une autre façon propre de résoudre cela?

+2

Vous devrez peut-être le résoudre avec un fichier 'Setup.hs' personnalisé et un hook post-installation. Bien que dans ce cas, je vais probablement juste modifier votre code pour définir le bit exécutable avant d'appeler 'createProcess', car les fichiers' Setup.hs' personnalisés peuvent être un PITA –

+0

@MichaelSnoyman: Mais je pense que mon code ne serait pas nécessairement avoir les permissions pour définir le bit exécutable, s'il est installé dans les répertoires système et exécuté par un utilisateur – yairchu

+0

Vous avez raison. Dans ce cas, vous devrez peut-être utiliser l'option Setup.hs ou recourir à des astuces comme copier le fichier dans un emplacement temporaire, puis définir le bit exécutable. –

Répondre

3

Comme résumé dans certains discussion sur les correctifs de la cabale, l'état actuel (underdocumented) du jeu est que l'on doit utiliser à la fois une copie et un crochet d'installation, puisque l'un ou l'autre sera été exécutée.

Editer: Après quelques recherches, il y a un old ticket on libexec support en cabale, ce qui serait une très bonne solution si elle était implémentée.

+0

En ce qui concerne la deuxième solution - @MichaelSnoyman a également suggéré que ci-dessus, mais nous avons conclu que cela ne fonctionnera pas nécessairement car l'application peut être exécutée par un utilisateur sans autorisations pour modifier les fichiers de données installés globalement. – yairchu

+0

J'ai édité votre réponse pour enlever la deuxième solution problématique, pour accepter le premier comme réponse. – yairchu