Cygwin (/ˈsɪɡwɪn/ SIG-win)[2] is a POSIX-compatible programming and runtime environment that runs natively on Microsoft Windows. Under Cygwin, source code designed for Unix-like operating systems may be compiled and run natively with minimal modification.

Cygwin
Cygwin logo.svg
Running Cygwin, including Cygwin/X, under Windows XP
Running Cygwin, including Cygwin/X, under Windows XP
Original author(s)Steve Chamberlain, Cygnus Solutions
Developer(s)Cygnus Solutions, Red Hat, Cygwin project volunteers
Initial release1995; 25 years ago (1995)
Stable release
3.1.7-1[1] / August 24, 2020; 29 days ago (2020-08-24)
Repository Edit this at Wikidata
Written inC/C++
Operating systemMicrosoft Windows
TypePOSIX standard utilities, POSIX standard library, C standard library, compatibility layer
LicenseLGPLv3
Websitecygwin.com/ Edit this on Wikidata

The Cygwin installation directory has a similar directory layout to that found in the root file system of Unix-like systems, with familiar directories, such as /bin, /home, /etc, /usr, /var. Cygwin installs with hundreds of command-line tools and other programs commonly found on a Unix-like system. Additionally, many applications may be installed from a packaging system. The terminal emulator Mintty is the default command-line interface provided to interact with the environment.

Cygwin provides native integration of Windows-based applications. Thus it is possible to launch Windows applications from the Cygwin environment, as well as to use Cygwin tools and applications within the Windows operating context.

Cygwin consists of two parts: a dynamic-link library (DLL) as an API compatibility layer in the form of a C standard library providing a substantial part of the POSIX API functionality, and an extensive collection of software tools and applications that provide a Unix-like look and feel.

Cygwin was originally developed by Cygnus Solutions[3][4], which was later acquired by Red Hat (now part of IBM), to port the GNU/Linux toolchain to Win32, including the GNU Compiler Suite. Rather than rewrite all the tools to use Win32 runtimes, Cygwin implemented a POSIX compatible runtime as a DLL.[5] It is free and open-source software, released under the GNU Lesser General Public License version 3.[6] Today it is maintained by volunteers including employees of Red Hat and many others.

DescriptionEdit

The Cygwin environment is provided in two versions, for 32-bit versions of Windows, and for 64-bit versions. Cygwin consists of a library that implements the POSIX system call API in terms of Windows system calls, a GNU development toolchain (including GCC and GDB) to allow software development, and running of a large number of application programs equivalent to those on Unix systems. Programmers have ported many Unix, GNU, BSD and Linux programs and packages to Cygwin, including the X Window System, K Desktop Environment 3, GNOME,[7] Apache, and TeX. Cygwin permits installing inetd, syslogd, sshd, Apache, and other daemons as standard Windows services, allowing Microsoft Windows systems to emulate Unix and Linux servers.

Cygwin programs are installed by running Cygwin's "setup"[8] program, which downloads the necessary program and feature package files from repositories on the Internet. As mentioned, there are two versions of this setup program, one for 32-bit versions of the Cygwin DLL, and corresponding applications, and one for 64-bit versions. Setup can install, update, and remove programs and their source code packages. A complete installation will take in excess of 90 GB[9] of hard disk space, but usable configurations may require as little as 1 or 2 GB.

Efforts to reconcile concepts that differ between Unix and Windows systems include:

  • A Cygwin-specific version of the Unix mount command allows mounting Windows paths as "filesystems" in the Unix file space. Initial mount-points can be configured in /etc/fstab, which has a format very similar to Unix systems, except that Windows paths appear in place of devices. Filesystems can be mounted in binary mode (by default), or in text mode, which enables automatic conversion between LF and CRLF endings (which only affects programs that open files without explicitly specifying text or binary mode).
  • Cygwin 1.7 introduced comprehensive support for POSIX locales and many character encodings, whereby the UTF-8 Unicode encoding became the default. Windows file-names and other identifiers, which are encoded as UTF-16, are automatically converted to and from the selected character-encoding.
  • Windows drive letters map to a special directory, so for example C: appears as /cygdrive/c. The /cygdrive prefix can be changed. Windows network paths of the form \\HOST\SHARE\FILE are mapped to //HOST/SHARE/FILE. Windows paths can also be used directly from Cygwin programs, but many programs do not support them correctly, hence this is discouraged.
  • Full-featured /dev and /proc file-systems are provided. /proc/registry provides direct filesystem access to the registry.
  • Cygwin supports POSIX symbolic links, representing them as plain-text files with the system attribute set. Cygwin 1.5 represented them as Windows Explorer shortcuts, but this has been changed for reasons of performance and POSIX correctness. Cygwin also recognises NTFS junction points and symbolic links and treats them as POSIX symbolic links, but it does not create them as their semantics are not fully POSIX-compliant.
  • The POSIX API for handling access control lists (ACLs) is supported and maps to the Windows NT ACL system.[10]
  • Special formats of /etc/passwd and /etc/group are provided that include pointers to the Windows equivalent SIDs (in the Gecos field), allowing for mapping between Unix and Windows users and groups.
  • The fork system call for duplicating a process is fully implemented, but it does not map well to the Windows API. For example, the copy-on-write optimization strategy could not be used.[11][12][13] As a result, Cygwin's fork is rather slow compared with Linux and others. (That overhead can often be avoided by replacing uses of the fork/exec technique with calls to the spawn functions declared in the Windows-specific process.h header).
  • The Cygwin DLL contains a console driver that emulates a Unix-style terminal within the Windows console. Cygwin's default user interface is the bash shell running in the Cygwin console.
  • The DLL also implements pseudo terminal (pty) devices. Cygwin ships with a number of terminal emulators that are based on them, including mintty, rxvt(-unicode), and xterm. These are more compliant with Unix terminal standards and user interface conventions than the Cygwin console, but are less suited for running Windows console programs.
  • Various utilities are provided for converting between Windows and Unix paths and file formats, for handling line ending (CRLF/LF) issues, for displaying the DLLs that an executable is linked with, etc.
  • Apart from always being linked against the Cygwin DLL, Cygwin executables are normal Windows executables. This means that Cygwin programs have full access to the Windows API and other Windows libraries, which allows gradual porting of programs from one platform to the other. However, programmers need to be careful about mixing conflicting POSIX and Windows functions.

The version of gcc that comes with Cygwin has various extensions for creating Windows DLLs, specifying whether a program is a windowing or console-mode program, adding resources, etc. Support for compiling programs that do not require the POSIX compatibility layer provided by the Cygwin DLL used to be included in the default gcc, but as of 2014 is provided by cross-compilers contributed by the MinGW-w64 project.

Cygwin is used heavily for porting many popular pieces of software to the Windows platform. It is used to compile Sun Java, LibreOffice, and even web server software like Lighttpd and Hiawatha.[14]

The Cygwin API library is licensed under the GNU Lesser General Public License version 3 (or later) with an exception to allow linking to any free and open-source software whose license conforms to the Open Source Definition[15] (less strict than the Free Software Definition).

HistoryEdit

Cygwin began in 1995 as a project of Steve Chamberlain, a Cygnus engineer who observed that Windows NT and 95 used COFF as their object file format, and that GNU already included support for x86 and COFF, and the C library newlib. He thought it would be possible to retarget GCC and produce a cross compiler generating executables that could run on Windows. This proved practical and a prototype was quickly developed.

The next step was to attempt to bootstrap the compiler on a Windows system, requiring sufficient emulation of Unix to let the GNU configure shell script run. A Bourne shell-compatible command interpreter, such as bash, was needed and in turn a fork system call emulation and standard input/output. Windows includes similar functionality, so the Cygwin library just needed to provide a POSIX-compatible application programming interface (API) and properly translate calls and manage private versions of data, such as file descriptors.

Initially, Cygwin was called gnuwin32 (not to be confused with the current GnuWin32 project). The name was changed to Cygwin32 to emphasize Cygnus' role in creating it. When Microsoft registered the trademark Win32, the 32 was dropped to simply become Cygwin.

By 1996, other engineers had joined in, because it was clear that Cygwin would be a useful way to provide Cygnus' embedded tools hosted on Windows systems (the previous strategy had been to use DJGPP). It was especially attractive because it was possible to do a three-way cross-compile, for instance to use a hefty Sun Microsystems workstation to build, say, a Windows-x-MIPS cross-compiler, which was faster than using the PC at the time. In 1999, Cygnus offered Cygwin 1.0 as a commercial product[16] of interest in its own right although subsequent versions have not been released, instead relying on continued open source releases.

Geoffrey Noer was the project lead from 1996 to 1999.[17][18] Christopher Faylor was the project lead from 1999 to mid-2014. Corinna Vinschen became co-lead since 2004[19] when Faylor left Red Hat and has been lead since mid-2014, when Faylor withdrew from active participation in the project.[20]

FeaturesEdit

Cygwin's base package selection is fairly small (about 100 MB[21]), containing little more than the bash (interactive user) and dash (installation) shells and the core file and text manipulation utilities expected of a Unix command line. Additional packages are available as optional installs from within Cygwin's package manager ("setup-x86.exe" – 32bit & "setup-x86_64.exe" – 64bit). These include (among many others[22]):

The Cygwin/X project contributes an implementation of the X Window System that allows graphical Unix programs to display their user interfaces on the Windows desktop. This can be used with both local and remote programs. Cygwin/X supports over 500 packages including major X window managers, desktop environments, and applications, for example:

In addition to the low-level Xlib/XCB libraries for developing X applications, Cygwin also ships with various higher-level and cross-platform GUI frameworks, including GTK+ and Qt.

The Cygwin Ports project provided many additional packages that were not available in the Cygwin distribution itself. Examples included GNOME and K Desktop Environment 3 as well as the MySQL database and the PHP scripting language. Most ports have been adopted by volunteer maintainers as Cygwin packages, and Cygwin Ports are no longer maintained.

ReferencesEdit

  1. ^ Vinschen, Corinna (2020-08-24). "cygwin 3.1.7-1". Cygwin Announcements (Mailing list). Retrieved 2020-08-24.
  2. ^ Hall, Larry (2004-09-14). "Re: How do you pronounce it?". Cygwin (Mailing list). Retrieved 2007-10-10.
  3. ^ "A brief history of the Cygwin project". Cygwin. 2018-02-02. Retrieved 2020-01-10.
  4. ^ "Cygwin32: A Free Win32 Porting Layer for UNIX® Applications". USENIX. 1998-08-03. Retrieved 2020-01-10.
  5. ^ "(Solved) Linux Subsystem vs Cygwin vs MobaXterm". Tech Help Forum by How-To Geek. 2017-01-24. Retrieved 2019-03-15.
  6. ^ "Cygwin library now available under GNU Lesser General Public License". Red Hat.
  7. ^ "Cygwin Ports". Retrieved 2 May 2015.
  8. ^ Delorie, DJ (2000-04-17). "New Cygwin Net Release". Cygwin (Mailing list). Retrieved 2020-01-10.
  9. ^ "What is the current full install size of Cygwin?". StackOverflow. 2018-05-28. Retrieved 2020-01-11.
  10. ^ Vinschen, Corinna (2016-01-16). "Updated: Cygwin 2.4.0-1". Cygwin Announcements (Mailing list). Retrieved 2020-01-11.
  11. ^ "Cygwin FAQ: How is fork() implemented?". Retrieved Oct 10, 2010.
  12. ^ "Highlights of Cygwin Functionality: Process Creation". Retrieved Dec 24, 2014.
  13. ^ Blake, Eric (Jan 15, 2009). "Bash doesn't launch the applications directly". Cygwin (Mailing list). Retrieved Oct 10, 2010.
  14. ^ Windows package of Hiawatha Webserver compiled via Cygwin
  15. ^ "What are the licensing terms?". Cygwin. Archived from the original on 2012-07-28.
  16. ^ "Cygwin Unites Unix and Windows Apps". Google Books. 1999-11-15. Retrieved 2020-01-13.
  17. ^ Delorie, DJ (1999-02-17). "fyi: who does what". Cygwin (Mailing list). Retrieved 2020-01-13.
  18. ^ Noer, Geoffrey (1999-02-19). "A partial goodbye..." Cygwin (Mailing list). Retrieved 2020-01-13.
  19. ^ Faylor, Christopher (2004-03-31). "Changing jobs". Cygwin (Mailing list). Retrieved 2020-01-13.
  20. ^ Faylor, Christopher (2014-07-31). "Christopher Faylor – Withdrawing from the project". Cygwin (Mailing list). Retrieved 2 May 2015.
  21. ^ "Installing and Updating Cygwin Packages". Cygwin. Retrieved 2020-01-11.
  22. ^ "Cygwin Package List". Cygwin. Retrieved 2020-01-11.

External linksEdit