|
# winpty |
|
|
|
[](https://tea-ci.org/rprichard/winpty) |
|
|
|
winpty is a Windows software package providing an interface similar to a Unix |
|
pty-master for communicating with Windows console programs. The package |
|
consists of a library (libwinpty) and a tool for Cygwin and MSYS for running |
|
Windows console programs in a Cygwin/MSYS pty. |
|
|
|
The software works by starting the `winpty-agent.exe` process with a new, |
|
hidden console window, which bridges between the console API and terminal |
|
input/output escape codes. It polls the hidden console's screen buffer for |
|
changes and generates a corresponding stream of output. |
|
|
|
The Unix adapter allows running Windows console programs (e.g. CMD, PowerShell, |
|
IronPython, etc.) under `mintty` or Cygwin's `sshd` with |
|
properly-functioning input (e.g. arrow and function keys) and output (e.g. line |
|
buffering). The library could be also useful for writing a non-Cygwin SSH |
|
server. |
|
|
|
## Supported Windows versions |
|
|
|
winpty runs on Windows XP through Windows 10, including server versions. It |
|
can be compiled into either 32-bit or 64-bit binaries. |
|
|
|
## Cygwin/MSYS adapter (`winpty.exe`) |
|
|
|
### Prerequisites |
|
|
|
You need the following to build winpty: |
|
|
|
* A Cygwin or MSYS installation |
|
* GNU make |
|
* A MinGW g++ toolchain capable of compiling C++11 code to build `winpty.dll` |
|
and `winpty-agent.exe` |
|
* A g++ toolchain targeting Cygwin or MSYS to build `winpty.exe` |
|
|
|
Winpty requires two g++ toolchains as it is split into two parts. The |
|
`winpty.dll` and `winpty-agent.exe` binaries interface with the native |
|
Windows command prompt window so they are compiled with the native MinGW |
|
toolchain. The `winpty.exe` binary interfaces with the MSYS/Cygwin terminal so |
|
it is compiled with the MSYS/Cygwin toolchain. |
|
|
|
MinGW appears to be split into two distributions -- MinGW (creates 32-bit |
|
binaries) and MinGW-w64 (creates both 32-bit and 64-bit binaries). Either |
|
one is generally acceptable. |
|
|
|
#### Cygwin packages |
|
|
|
The default g++ compiler for Cygwin targets Cygwin itself, but Cygwin also |
|
packages MinGW-w64 compilers. As of this writing, the necessary packages are: |
|
|
|
* Either `mingw64-i686-gcc-g++` or `mingw64-x86_64-gcc-g++`. Select the |
|
appropriate compiler for your CPU architecture. |
|
* `gcc-g++` |
|
* `make` |
|
|
|
As of this writing (2016-01-23), only the MinGW-w64 compiler is acceptable. |
|
The MinGW compiler (e.g. from the `mingw-gcc-g++` package) is no longer |
|
maintained and is too buggy. |
|
|
|
#### MSYS packages |
|
|
|
For the original MSYS, use the `mingw-get` tool (MinGW Installation Manager), |
|
and select at least these components: |
|
|
|
* `mingw-developer-toolkit` |
|
* `mingw32-base` |
|
* `mingw32-gcc-g++` |
|
* `msys-base` |
|
* `msys-system-builder` |
|
|
|
When running `./configure`, make sure that `mingw32-g++` is in your |
|
`PATH`. It will be in the `C:\MinGW\bin` directory. |
|
|
|
#### MSYS2 packages |
|
|
|
For MSYS2, use `pacman` and install at least these packages: |
|
|
|
* `msys/gcc` |
|
* `mingw32/mingw-w64-i686-gcc` or `mingw64/mingw-w64-x86_64-gcc`. Select |
|
the appropriate compiler for your CPU architecture. |
|
* `make` |
|
|
|
MSYS2 provides three start menu shortcuts for starting MSYS2: |
|
|
|
* MinGW-w64 Win32 Shell |
|
* MinGW-w64 Win64 Shell |
|
* MSYS2 Shell |
|
|
|
To build winpty, use the MinGW-w64 {Win32,Win64} shortcut of the architecture |
|
matching MSYS2. These shortcuts will put the g++ compiler from the |
|
`{mingw32,mingw64}/mingw-w64-{i686,x86_64}-gcc` packages into the `PATH`. |
|
|
|
Alternatively, instead of installing `mingw32/mingw-w64-i686-gcc` or |
|
`mingw64/mingw-w64-x86_64-gcc`, install the `mingw-w64-cross-gcc` and |
|
`mingw-w64-cross-crt-git` packages. These packages install cross-compilers |
|
into `/opt/bin`, and then any of the three shortcuts will work. |
|
|
|
### Building the Unix adapter |
|
|
|
In the project directory, run `./configure`, then `make`, then `make install`. |
|
By default, winpty is installed into `/usr/local`. Pass `PREFIX=<path>` to |
|
`make install` to override this default. |
|
|
|
### Using the Unix adapter |
|
|
|
To run a Windows console program in `mintty` or Cygwin `sshd`, prepend |
|
`winpty` to the command-line: |
|
|
|
$ winpty powershell |
|
Windows PowerShell |
|
Copyright (C) 2009 Microsoft Corporation. All rights reserved. |
|
|
|
PS C:\rprichard\proj\winpty> 10 + 20 |
|
30 |
|
PS C:\rprichard\proj\winpty> exit |
|
|
|
## Embedding winpty / MSVC compilation |
|
|
|
See `src/include/winpty.h` for the prototypes of functions exported by |
|
`winpty.dll`. |
|
|
|
Only the `winpty.exe` binary uses Cygwin; all the other binaries work without |
|
it and can be compiled with either MinGW or MSVC. To compile using MSVC, |
|
download gyp and run `gyp -I configurations.gypi` in the `src` subdirectory. |
|
This will generate a `winpty.sln` and associated project files. See the |
|
`src/winpty.gyp` and `src/configurations.gypi` files for notes on dealing with |
|
MSVC versions and different architectures. |
|
|
|
Compiling winpty with MSVC currently requires MSVC 2013 or newer. |
|
|
|
## Debugging winpty |
|
|
|
winpty comes with a tool for collecting timestamped debugging output. To use |
|
it: |
|
|
|
1. Run `winpty-debugserver.exe` on the same computer as winpty. |
|
2. Set the `WINPTY_DEBUG` environment variable to `trace` for the |
|
`winpty.exe` process and/or the process using `libwinpty.dll`. |
|
|
|
winpty also recognizes a `WINPTY_SHOW_CONSOLE` environment variable. Set it |
|
to 1 to prevent winpty from hiding the console window. |
|
|
|
## Copyright |
|
|
|
This project is distributed under the MIT license (see the `LICENSE` file in |
|
the project root). |
|
|
|
By submitting a pull request for this project, you agree to license your |
|
contribution under the MIT license to this project. |
|
|