Des bonnes alternatives à Cygwin? - Cygwin ne prend pas en charge nativement en charge des applications Win32

Mise à jour 1/9/2014: TL;DR version: Aller en bas de ce post pour un moyen d'obtenir Cygwin pour être en mesure d'appeler les non-Cygwin programmes.

Après avoir passé le temps de faire quelques scripts bash qui se trouvent être de taille importante, des versions plus récentes de Cygwin ont brisé entre eux. Ces scripts d'appel en natif Win32 applications qui n'ont pas un lien avec Cygwin, ce qui n'est apparemment pas officiellement pris en charge par Cygwin.

C'est venu comme une surprise pour moi, comme depuis des années, j'étais sous l'impression que Cygwin peut être utilisé dans plus d'un environnement mixte qui combine à la fois natif non-Cygwin Win32 apps, et POSIX programmes à l'aide de la Cygwin couche de compatibilité. Mais apparemment, seule la couche de compatibilité POSIX est vraiment pris en charge, et si Win32 natif non-Cygwin apps de travail alors il est considéré comme une heureuse coïncidence.

J'ai trouvé ceci à partir d'une incompatibilité, j'ai couru dans exécuter des programmes compilés sur le .NET Framework à partir à l'intérieur de Cygwin. Ce bien fonctionner, mais a été brisé il y a quelques mois. Plus précisément, la sortie standard d'un .NET programme qui est transmise à tout autre programme Win32 l'entrée standard généralement en sorte que le récepteur programme Win32 pour obtenir une fin prématurée-de-fichier de signal parce que Cygwin est récemment passé le message des tuyaux à partir de l'octet tuyaux il y a quelques mois - et le message tuyaux semblent être incompatibles avec toute application réceptrice à l'aide de Visual C++ ou .NET Framework. C'est parce que .NET des questions null écrire sur la sortie standard, ce qui n'est passé à l'application réceptrice si un message tuyau est utilisé. L'application réceptrice lit correctement zéro octets, de sorte que pense qu'il est en fin de fichier. Le chef de projet ne semble pas considérer cela comme un réel problème, car ils ne semblent pas vraiment favorable à l'exécution non-Cygwin les programmes à partir de Cygwin (surprise!).

Pour citer le responsable du projet Christopher Faylor à partir de plusieurs e-mails sur la liste de diffusion:

Ce que vous voyez peut-être parce que Cygwin a été modifiée pour utiliser
message-type de tuyaux d'un couple de révisions ans. Cela ne va pas
changement. La modification a été adoptée pour résoudre un problème avec Cygwin programmes
et ceux sont évidemment notre priorité #1.

Indépendamment de la façon dont beaucoup de gens l'utilisation de Visual C++ ou .NET ils sont vraiment
pas notre public cible. C'est agréable quand les choses fonctionnent pour les personnes qui
ne voulez pas utiliser les outils UNIX, mais ils ne sont pas notre objectif principal.
Résolution des problèmes pour les personnes qui veulent utiliser non Cygwin choses n'est pas
quelque chose que je trouve une haute priorité.

De pipe.cc: Notez que l'écriture, à côté du tuyau est ouvert comme PIPE_TYPE_MESSAGE.
Cette semble pour mieux imiter Linux tuyau de comportement et de l'est
certainement nécessaire pour pty manipulation depuis fhandler_pty_master écrit
pour la pipe en morceaux, terminée par le caractère de saut de ligne lorsque le CANON est en mode
spécifié.

Le commentaire ci-dessus montre une relation "et" ici. Type de Message
les tuyaux de reproduire plus fidèlement Linux (UNIX) tuyau de comportement ET sont certainement
requis pour le pty-s.

Je suis d'accord avec James que les temps d'exécution sont probablement buggy MAIS j'ai aussi
acceptez que cygwin devrait être en mesure d'avoir une poignée de ces scénarios.

Votre accord les uns avec les autres ne va pas avoir beaucoup
effet. Cygwin code source n'est pas modifiée par le vote.

Même si cette question est finalement fixée en quelque sorte - qui sait, ils pourraient se casser quelque chose d'autre dans 3 mois et pas soin de fixer la régression. Ils pourraient envisager un patch, mais il me faudrait un certain temps pour comprendre quelque chose qui fonctionne. Je pense que mon temps est mieux dépensé ailleurs, parce qu'il est clair qu'ils sont tout à fait prêts à casser la compatibilité avec Win32 natif des applications et vous ne voulez pas perdre plus de temps sur se Win32 applications. Donc je suppose que Cygwin ne devrait pas être considéré comme une plate-forme stable pour mixte Win32/Cygwin environnements - quelles sont mes options? Où dois-je commencer, qui permettrait d'éviter une réécriture complète en quelque chose d'autre que bash? Je n'utilisez pas plus de la base d'installation de Cygwin + base de scripts perl.

Mise à JOUR: Après la publication de cette question d'origine, ils ont finalement une nouvelle pipe_byte drapeau dans le CYGWIN variable d'environnement: regardez la documentation. Si ce drapeau est réglé, il va corriger le problème décrit ci-dessus. Lors de l'invocation d'un non-Cygwin Win32 programme, toujours assurez-vous que le pipe_byte drapeau est réglé.

Cependant, depuis, j'ai découvert une incompatibilité avec .NET Framework 4.0 et Cygwin. Les versions précédentes de .NET Framework n'ont pas ce problème. J'ai évoqué la question d'abord sur la Cygwin liste de diffusion ici:

Tuyau de synchronisation et d'incompatibilité entre Cygwin et .NET Framework 4.0

Pas fructueux réponses, j'ai étudié et a trouvé que Cygwin est la création se chevauchent les tuyaux, ce qui provoque le problème. Notez que le fait d'essayer d'utiliser les non-chevauchement de l'API Win32 appels avec un superposé de la pipe n'est pas défini, et la plupart (tous?) Win32 non-Cygwin programmes n'utilisent pas les e/S avec chevauchement avec leur niveau de descripteurs de fichiers. J'ai soumis un patch qui crée un pipe_nooverlap drapeau dans le CYGWIN variable d'environnement qui empêche que cela se passe:

Patch pour désactiver éventuellement se chevauchent tuyaux

Malheureusement, ils ont rejeté le patch, de sorte que vous ne verrez jamais cela dans les principaux DLL Cygwin:

Re: Patch pour désactiver éventuellement se chevauchent tuyaux

Le raisonnement pour rejeter le patch:

  1. Il était implicite que je me suis cassé le signal de mise en œuvre dans Cygwin; je n'ai pas trouvé que cela soit le cas, comme des signaux utilisent encore se chevauchent tuyaux.
  2. Ils ne se sentent pas comme l'ajout d'une variable d'environnement drapeau, même si elle est apparemment la résolution des problèmes.
  3. Ils ne veulent pas le code de prise en charge qui a même l'option de non-chevauchement des tuyaux.

Avec le raisonnement et les attitudes de ce genre, je crains que je ne peux pas penser à une manière de changer le patch pour répondre à leurs exigences... ils semblent déterminés à interdire les non-chevauchement des tuyaux jamais utilisé. J'ai été en utilisant le patch pour un certain temps maintenant, et n'ont pas eu de problèmes avec elle. Aussi, je ne peux pas penser à toutes les situations que l' pipe_nooverlap drapeau de la rupture (voir mon suivi de l'e-mail sur leur liste de diffusion), mais je l'ai laissé comme un drapeau, juste au cas où il ya des problèmes.

Donc, si vous voulez l'appeler non-Cygwin Win32 ou .NET Framework programmes à partir de Cygwin, vous devez effectuer les opérations suivantes:

  1. Appliquer mon patch à la source de tous Cygwin version que vous utilisez. Ne pas s'attendre à ce patch à montrer dans les prochains Cygwin versions.
  2. Définir la pipe_byte et pipe_nooverlap de drapeaux dans le CYGWIN variable d'environnement.

Cela fonctionne... pour le moment!!! Je poste dans ce cas, il aide à quelqu'un d'autre qui veut encore l'utiliser Cygwin pour certaines choses.