Come compilare Polygen per Windows senza la dipendenza da cygwin1.dll.
Cygwin vs MinGW
Sul Wiki di MinGW leggiamo (grassetto mio):
Cygwin in contrast to MinGW
Cygwin applications by principle are not considered a "Native Win32 application" because it relies on the Cygwin® POSIX Emulation DLL or cygwin1.dll for Posix functions and does not use win32 functions directly. MinGW on the other hand, provides functions supplied by the Win32 API. While porting applications under MinGW, functions not native to Win32 such as fork(), mmap() or ioctl() will need to be reimplemented into Win32 equivalents for the application to function properly.
Lo stesso principio vale per MinGW-w64.
Questo thread su stackoverflow esamina i dettagli della questione:
https://stackoverflow.com/questions/187990/why-does-gcc-windows-depend-on-cygwin
In sintesi, se si compilasse Polygen usando MinGW-64 (GCC a 32 o 64 bit), l'exe finale non dipenderebbe da alcuna DLL (le librerie di MinGW-64 possono essere linkate staticamente).
Il problema è che sul sito MinGW-w64 non sono disponibili versioni per Windows che includano il supporto per OCaml. Però OCaml è disponibile in MSYS2:
https://github.com/Alexpux/MINGW-packages
mingw-w64-ocaml
mingw-w64-ocaml-camlp4
mingw-w64-ocaml-findlib
mingw-w64-ocaml-lablgtk
MSYS2 vs Cygwin
Dal Wiki di MSYS2 (grassetto mio):
How does MSYS2 differ from Cygwin
Cygwin and MSYS2 -- as projects -- have significantly different goals.
Cygwin tries to bring a POSIX-compatible environment to Windows so that most software that runs on unices will build and run on Cygwin without any significant modifications. Cygwin provides a large collection of packages containing such software, and libraries for their development.
MSYS2 tries to provide an environment for building native Windows software. MSYS2 provides a large collection of packages containing such software, and libraries for their development. As a large portion of the software uses GNU build tools which are tightly coupled to the unix world, this environment is also POSIX-compatible, and is in fact based on Cygwin.
MSYS2 provies a minimal shell required to run autotools and other build systems which get the source for software from the Internet from different repositories, configure them and build them. The shell and core tools exist mainly to allow porting Unix programs to run natively on Windows (i.e. without requiring a POSIX emulation layer). MSYS2 doesn't try to duplicate Cygwin's efforts more than necessary, so the number of provided POSIX-emulated software is very small.
Questo a conferma del fatto che MSYS2 consente la creazione di eseguibili che non necessitano di DLL per emulare il layer POSIX.
MSYS2 + MinGW-w64
Da quello che ho capito leggendo la documentazione di MSYS2, per creare eseguibili che non abbiano dipendenze da DLL, è necessario compilare con MinGW-64.
Praticamente MSYS2 offre diversi ambienti di sviluppo, alcuni dei quali legati al progetto MSYS2 stesso (e compilando in quell'ambiente si producono eseguibili che necessitano di DLL per il layer POSIX, come avviene con Cygwin), e infine vi sono gli ambienti MinGW-64 (a 32 o a 64 bit) che consentono invece di compilare eseguibili standalone che implementano il layer POSIX tramite Win API (e dipendono dalle varie DLL di MSVS, ormai presenti di default in tutte le versioni di Windows moderne).
Conclusioni
Concludendo, sarebbe utile a mio avviso considerare di appoaggiarsi a MSYS2 per future compilazioni di Polygen per Windows, e liberarsi della dipendenza da cygwin1.dll. Quando la versione di cygwin1.dll del sito Polygen.org ha semsso di funzionare con Win 7, non sono più stato in grado di usare Polygen per qualche anno; una seccatura.
Stato compilabile dei sorgenti?
Io non ho avuto modo di testare quanto sopra. Sto valutando la possibilità di installare MSYS2 e fare un tentativo (sto solo verificando che non vi siano potenziali conflitti con altre applicazioni sulla mia macchina, ma sembra che MSYS operi in un ambiente completamente isolato).
Tu hai modo di confermarmi se il sorgente di Polygen è compilabile con la versione di OCaml che verrebbe installata da MSYS2? La v1.0.6 ha oltre 10, magari OCaml è cambiato nel frattempo. Vorrei evitare di installare MSYS2 (che mi pare di capire richiederà mezza giornata, tra settaggi, librerie e dipendenze, e cercare di capire come muovercisi dentro) solo per poi scoprire che i sorgenti attuali (quelli del repo, o quelli della v1.0.6) non possono compilare senza modifiche.
Che differenza c'è tra i sorgenti del repo (segnalati come v1.0.7) e quelli invece disponibili dal sito (1.0.6 del 2005)?
Mi sarebbe piaciuto testarlo in altri modi, ma come ti dissi il mio tentativo di installare OCaml (versione OCPWin, che contiene MinGW-w64) su Windows è stato disastroso: l'antivirus mi ha ranzato via 60% dei binari di OCaml. Le altre distribuzioni di OCaml per Win disponibili sono tutte basate su Cygwin, allora tanto vale installare MSYS2 e poi scaricare OCaml col suo package manager.
Purtroppo, anche i tentativi di cross compilare Polygen da Ubuntu tramite MinGW-w64 sono falliti — credo per via del fatto che il makefile andrebbe modificato per specificare di usare il crosscompilatore MinGW-w64 anziché il compilatore OCaml.
Link di Approfondimento
MinGW-w64
MSYS2
Come compilare Polygen per Windows senza la dipendenza da
cygwin1.dll.Cygwin vs MinGW
Sul Wiki di MinGW leggiamo (grassetto mio):
Lo stesso principio vale per MinGW-w64.
Questo thread su stackoverflow esamina i dettagli della questione:
https://stackoverflow.com/questions/187990/why-does-gcc-windows-depend-on-cygwin
In sintesi, se si compilasse Polygen usando MinGW-64 (GCC a 32 o 64 bit), l'exe finale non dipenderebbe da alcuna DLL (le librerie di MinGW-64 possono essere linkate staticamente).
Il problema è che sul sito MinGW-w64 non sono disponibili versioni per Windows che includano il supporto per OCaml. Però OCaml è disponibile in MSYS2:
https://github.com/Alexpux/MINGW-packages
mingw-w64-ocamlmingw-w64-ocaml-camlp4mingw-w64-ocaml-findlibmingw-w64-ocaml-lablgtkMSYS2 vs Cygwin
Dal Wiki di MSYS2 (grassetto mio):
Questo a conferma del fatto che MSYS2 consente la creazione di eseguibili che non necessitano di DLL per emulare il layer POSIX.
MSYS2 + MinGW-w64
Da quello che ho capito leggendo la documentazione di MSYS2, per creare eseguibili che non abbiano dipendenze da DLL, è necessario compilare con MinGW-64.
Praticamente MSYS2 offre diversi ambienti di sviluppo, alcuni dei quali legati al progetto MSYS2 stesso (e compilando in quell'ambiente si producono eseguibili che necessitano di DLL per il layer POSIX, come avviene con Cygwin), e infine vi sono gli ambienti MinGW-64 (a 32 o a 64 bit) che consentono invece di compilare eseguibili standalone che implementano il layer POSIX tramite Win API (e dipendono dalle varie DLL di MSVS, ormai presenti di default in tutte le versioni di Windows moderne).
Conclusioni
Concludendo, sarebbe utile a mio avviso considerare di appoaggiarsi a MSYS2 per future compilazioni di Polygen per Windows, e liberarsi della dipendenza da
cygwin1.dll. Quando la versione dicygwin1.dlldel sito Polygen.org ha semsso di funzionare con Win 7, non sono più stato in grado di usare Polygen per qualche anno; una seccatura.Stato compilabile dei sorgenti?
Io non ho avuto modo di testare quanto sopra. Sto valutando la possibilità di installare MSYS2 e fare un tentativo (sto solo verificando che non vi siano potenziali conflitti con altre applicazioni sulla mia macchina, ma sembra che MSYS operi in un ambiente completamente isolato).
Tu hai modo di confermarmi se il sorgente di Polygen è compilabile con la versione di OCaml che verrebbe installata da MSYS2? La v1.0.6 ha oltre 10, magari OCaml è cambiato nel frattempo. Vorrei evitare di installare MSYS2 (che mi pare di capire richiederà mezza giornata, tra settaggi, librerie e dipendenze, e cercare di capire come muovercisi dentro) solo per poi scoprire che i sorgenti attuali (quelli del repo, o quelli della v1.0.6) non possono compilare senza modifiche.
Che differenza c'è tra i sorgenti del repo (segnalati come v1.0.7) e quelli invece disponibili dal sito (1.0.6 del 2005)?
Mi sarebbe piaciuto testarlo in altri modi, ma come ti dissi il mio tentativo di installare OCaml (versione OCPWin, che contiene MinGW-w64) su Windows è stato disastroso: l'antivirus mi ha ranzato via 60% dei binari di OCaml. Le altre distribuzioni di OCaml per Win disponibili sono tutte basate su Cygwin, allora tanto vale installare MSYS2 e poi scaricare OCaml col suo package manager.
Purtroppo, anche i tentativi di cross compilare Polygen da Ubuntu tramite MinGW-w64 sono falliti — credo per via del fatto che il makefile andrebbe modificato per specificare di usare il crosscompilatore MinGW-w64 anziché il compilatore OCaml.
Link di Approfondimento
MinGW-w64
MSYS2