2014-08-07 13:03:17 +02:00
|
|
|
![libuv][libuv_banner]
|
|
|
|
|
|
|
|
## Overview
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
libuv is a multi-platform support library with a focus on asynchronous I/O. It
|
2017-07-07 01:12:45 +02:00
|
|
|
was primarily developed for use by [Node.js][], but it's also
|
2014-11-21 15:43:12 +01:00
|
|
|
used by [Luvit](http://luvit.io/), [Julia](http://julialang.org/),
|
2014-11-26 22:37:41 +01:00
|
|
|
[pyuv](https://github.com/saghul/pyuv), and [others](https://github.com/libuv/libuv/wiki/Projects-that-use-libuv).
|
2011-05-13 04:16:40 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
## Feature highlights
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Full-featured event loop backed by epoll, kqueue, IOCP, event ports.
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Asynchronous TCP and UDP sockets
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Asynchronous DNS resolution
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Asynchronous file and file system operations
|
2011-09-24 05:23:41 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* File system events
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* ANSI escape code controlled TTY
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* IPC with socket sharing, using Unix domain sockets or named pipes (Windows)
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Child processes
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Thread pool
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Signal handling
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* High resolution clock
|
2011-09-30 20:22:38 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
* Threading and synchronization primitives
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2014-09-19 19:37:55 +02:00
|
|
|
## Versioning
|
|
|
|
|
|
|
|
Starting with version 1.0.0 libuv follows the [semantic versioning](http://semver.org/)
|
2014-12-09 21:01:35 +01:00
|
|
|
scheme. The API change and backwards compatibility rules are those indicated by
|
2014-09-19 19:37:55 +02:00
|
|
|
SemVer. libuv will keep a stable ABI across major releases.
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2016-10-25 04:13:07 +02:00
|
|
|
The ABI/API changes can be tracked [here](http://abi-laboratory.pro/tracker/timeline/libuv/).
|
|
|
|
|
|
|
|
## Licensing
|
|
|
|
|
|
|
|
libuv is licensed under the MIT license. Check the [LICENSE file](LICENSE).
|
2017-05-30 19:19:11 +02:00
|
|
|
The documentation is licensed under the CC BY 4.0 license. Check the [LICENSE-docs file](LICENSE-docs).
|
2016-10-25 04:13:07 +02:00
|
|
|
|
2012-10-06 23:04:30 +02:00
|
|
|
## Community
|
|
|
|
|
2017-05-30 19:19:11 +02:00
|
|
|
* [Support](https://github.com/libuv/help)
|
2012-10-06 23:04:30 +02:00
|
|
|
* [Mailing list](http://groups.google.com/group/libuv)
|
2014-12-09 21:01:35 +01:00
|
|
|
* [IRC chatroom (#libuv@irc.freenode.org)](http://webchat.freenode.net?channels=libuv&uio=d4)
|
2011-09-23 20:07:57 +02:00
|
|
|
|
|
|
|
## Documentation
|
|
|
|
|
2017-05-30 19:19:11 +02:00
|
|
|
### Official documentation
|
2014-09-19 19:37:55 +02:00
|
|
|
|
|
|
|
Located in the docs/ subdirectory. It uses the [Sphinx](http://sphinx-doc.org/)
|
|
|
|
framework, which makes it possible to build the documentation in multiple
|
|
|
|
formats.
|
|
|
|
|
|
|
|
Show different supported building options:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ make help
|
|
|
|
```
|
2014-09-19 19:37:55 +02:00
|
|
|
|
|
|
|
Build documentation as HTML:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ make html
|
|
|
|
```
|
2014-09-19 19:37:55 +02:00
|
|
|
|
2016-05-17 00:25:23 +02:00
|
|
|
Build documentation as HTML and live reload it when it changes (this requires
|
|
|
|
sphinx-autobuild to be installed and is only supported on Unix):
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ make livehtml
|
|
|
|
```
|
2016-05-17 00:25:23 +02:00
|
|
|
|
2014-09-19 19:37:55 +02:00
|
|
|
Build documentation as man pages:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ make man
|
|
|
|
```
|
2014-09-19 19:37:55 +02:00
|
|
|
|
|
|
|
Build documentation as ePub:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ make epub
|
|
|
|
```
|
2014-09-19 19:37:55 +02:00
|
|
|
|
|
|
|
NOTE: Windows users need to use make.bat instead of plain 'make'.
|
|
|
|
|
|
|
|
Documentation can be browsed online [here](http://docs.libuv.org).
|
|
|
|
|
2015-05-06 09:46:15 +02:00
|
|
|
The [tests and benchmarks](https://github.com/libuv/libuv/tree/master/test)
|
|
|
|
also serve as API specification and usage examples.
|
|
|
|
|
2014-09-19 19:37:55 +02:00
|
|
|
### Other resources
|
|
|
|
|
2013-12-31 19:33:54 +01:00
|
|
|
* [LXJS 2012 talk](http://www.youtube.com/watch?v=nGn60vDSxQ4)
|
|
|
|
— High-level introductory talk about libuv.
|
|
|
|
* [libuv-dox](https://github.com/thlorenz/libuv-dox)
|
|
|
|
— Documenting types and methods of libuv, mostly by reading uv.h.
|
2014-11-21 15:43:12 +01:00
|
|
|
* [learnuv](https://github.com/thlorenz/learnuv)
|
|
|
|
— Learn uv for fun and profit, a self guided workshop to libuv.
|
2011-09-23 20:07:57 +02:00
|
|
|
|
2015-05-06 09:46:15 +02:00
|
|
|
These resources are not handled by libuv maintainers and might be out of
|
|
|
|
date. Please verify it before opening new issues.
|
|
|
|
|
2015-08-05 21:17:46 +02:00
|
|
|
## Downloading
|
|
|
|
|
|
|
|
libuv can be downloaded either from the
|
|
|
|
[GitHub repository](https://github.com/libuv/libuv)
|
|
|
|
or from the [downloads site](http://dist.libuv.org/dist/).
|
|
|
|
|
|
|
|
Starting with libuv 1.7.0, binaries for Windows are also provided. This is to
|
|
|
|
be considered EXPERIMENTAL.
|
|
|
|
|
|
|
|
Before verifying the git tags or signature files, importing the relevant keys
|
|
|
|
is necessary. Key IDs are listed in the
|
|
|
|
[MAINTAINERS](https://github.com/libuv/libuv/blob/master/MAINTAINERS.md)
|
|
|
|
file, but are also available as git blob objects for easier use.
|
|
|
|
|
|
|
|
Importing a key the usual way:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ gpg --keyserver pool.sks-keyservers.net --recv-keys AE9BC059
|
|
|
|
```
|
2015-08-05 21:17:46 +02:00
|
|
|
|
|
|
|
Importing a key from a git blob object:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ git show pubkey-saghul | gpg --import
|
|
|
|
```
|
2015-08-05 21:17:46 +02:00
|
|
|
|
|
|
|
### Verifying releases
|
|
|
|
|
|
|
|
Git tags are signed with the developer's key, they can be verified as follows:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ git verify-tag v1.6.1
|
|
|
|
```
|
2015-08-05 21:17:46 +02:00
|
|
|
|
|
|
|
Starting with libuv 1.7.0, the tarballs stored in the
|
2015-12-13 12:07:04 +01:00
|
|
|
[downloads site](http://dist.libuv.org/dist/) are signed and an accompanying
|
2015-08-05 21:17:46 +02:00
|
|
|
signature file sit alongside each. Once both the release tarball and the
|
|
|
|
signature file are downloaded, the file can be verified as follows:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ gpg --verify libuv-1.7.0.tar.gz.sign
|
|
|
|
```
|
2015-08-05 21:17:46 +02:00
|
|
|
|
2011-09-23 20:07:57 +02:00
|
|
|
## Build Instructions
|
2011-05-13 04:16:40 +02:00
|
|
|
|
2014-10-21 00:45:30 +02:00
|
|
|
For GCC there are two build methods: via autotools or via [GYP][].
|
2013-07-16 21:04:31 +02:00
|
|
|
GYP is a meta-build system which can generate MSVS, Makefile, and XCode
|
|
|
|
backends. It is best used for integration into other projects.
|
2013-02-20 21:12:18 +01:00
|
|
|
|
2013-07-16 21:04:31 +02:00
|
|
|
To build with autotools:
|
2013-02-20 21:12:18 +01:00
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ sh autogen.sh
|
|
|
|
$ ./configure
|
|
|
|
$ make
|
|
|
|
$ make check
|
|
|
|
$ make install
|
|
|
|
```
|
2013-06-26 19:48:10 +02:00
|
|
|
|
2018-06-22 17:28:11 +02:00
|
|
|
To build with [CMake](https://cmake.org/):
|
|
|
|
|
|
|
|
```bash
|
2019-05-15 19:24:08 +02:00
|
|
|
$ mkdir -p out/cmake ; cd out/cmake # create build directory
|
|
|
|
$ cmake ../.. -DBUILD_TESTING=ON # generate project with test
|
|
|
|
$ cmake --build . # build
|
|
|
|
$ ctest -C Debug --output-on-failure # run tests
|
|
|
|
|
|
|
|
# Or manually run tests:
|
|
|
|
$ ./out/cmake/uv_run_tests # shared library build
|
|
|
|
$ ./out/cmake/uv_run_tests_a # static library build
|
2018-06-22 17:28:11 +02:00
|
|
|
```
|
|
|
|
|
2018-04-02 19:33:48 +02:00
|
|
|
To build with GYP, first run:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ git clone https://chromium.googlesource.com/external/gyp build/gyp
|
|
|
|
```
|
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
### Windows
|
2011-08-06 12:38:11 +02:00
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
Prerequisites:
|
|
|
|
|
|
|
|
* [Python 2.6 or 2.7][] as it is required
|
|
|
|
by [GYP][].
|
|
|
|
If python is not in your path, set the environment variable `PYTHON` to its
|
|
|
|
location. For example: `set PYTHON=C:\Python27\python.exe`
|
|
|
|
* One of:
|
|
|
|
* [Visual C++ Build Tools][]
|
|
|
|
* [Visual Studio 2015 Update 3][], all editions
|
|
|
|
including the Community edition (remember to select
|
|
|
|
"Common Tools for Visual C++ 2015" feature during installation).
|
|
|
|
* [Visual Studio 2017][], any edition (including the Build Tools SKU).
|
|
|
|
**Required Components:** "MSbuild", "VC++ 2017 v141 toolset" and one of the
|
|
|
|
Windows SDKs (10 or 8.1).
|
|
|
|
* Basic Unix tools required for some tests,
|
|
|
|
[Git for Windows][] includes Git Bash
|
|
|
|
and tools which can be included in the global `PATH`.
|
|
|
|
|
|
|
|
To build, launch a git shell (e.g. Cmd or PowerShell), run `vcbuild.bat`
|
|
|
|
(to build with VS2017 you need to explicitly add a `vs2017` argument),
|
|
|
|
which will checkout the GYP code into `build/gyp`, generate `uv.sln`
|
|
|
|
as well as the necesery related project files, and start building.
|
|
|
|
|
|
|
|
```console
|
|
|
|
> vcbuild
|
|
|
|
```
|
|
|
|
|
|
|
|
Or:
|
|
|
|
|
|
|
|
```console
|
|
|
|
> vcbuild vs2017
|
|
|
|
```
|
|
|
|
|
|
|
|
To run the tests:
|
|
|
|
|
|
|
|
```console
|
|
|
|
> vcbuild test
|
|
|
|
```
|
|
|
|
|
|
|
|
To see all the options that could passed to `vcbuild`:
|
|
|
|
|
|
|
|
```console
|
|
|
|
> vcbuild help
|
|
|
|
vcbuild.bat [debug/release] [test/bench] [clean] [noprojgen] [nobuild] [vs2017] [x86/x64] [static/shared]
|
|
|
|
Examples:
|
|
|
|
vcbuild.bat : builds debug build
|
|
|
|
vcbuild.bat test : builds debug build and runs tests
|
|
|
|
vcbuild.bat release bench: builds release build and runs benchmarks
|
|
|
|
```
|
2013-10-30 00:33:17 +01:00
|
|
|
|
2011-08-08 23:14:47 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
### Unix
|
|
|
|
|
2016-04-01 11:19:19 +02:00
|
|
|
For Debug builds (recommended) run:
|
2013-01-22 16:21:25 +01:00
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ ./gyp_uv.py -f make
|
|
|
|
$ make -C out
|
|
|
|
```
|
2013-01-22 16:21:25 +01:00
|
|
|
|
2016-04-01 11:19:19 +02:00
|
|
|
For Release builds run:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ ./gyp_uv.py -f make
|
|
|
|
$ BUILDTYPE=Release make -C out
|
|
|
|
```
|
2016-04-01 11:19:19 +02:00
|
|
|
|
2014-11-21 15:43:12 +01:00
|
|
|
Run `./gyp_uv.py -f make -Dtarget_arch=x32` to build [x32][] binaries.
|
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
### OS X
|
|
|
|
|
|
|
|
Run:
|
2011-08-08 23:14:47 +02:00
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ ./gyp_uv.py -f xcode
|
2018-12-16 20:18:16 +01:00
|
|
|
$ xcodebuild -ARCHS="x86_64" -project out/uv.xcodeproj -configuration Release -alltargets
|
2017-07-07 01:12:45 +02:00
|
|
|
```
|
2014-01-27 18:30:51 +01:00
|
|
|
|
2014-11-21 15:43:12 +01:00
|
|
|
Using Homebrew:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ brew install --HEAD libuv
|
|
|
|
```
|
2014-11-21 15:43:12 +01:00
|
|
|
|
2014-01-27 18:30:51 +01:00
|
|
|
Note to OS X users:
|
|
|
|
|
|
|
|
Make sure that you specify the architecture you wish to build for in the
|
|
|
|
"ARCHS" flag. You can specify more than one by delimiting with a space
|
|
|
|
(e.g. "x86_64 i386").
|
2011-08-08 23:14:47 +02:00
|
|
|
|
2013-10-30 00:33:17 +01:00
|
|
|
### Android
|
|
|
|
|
|
|
|
Run:
|
2011-08-08 23:14:47 +02:00
|
|
|
|
2018-09-21 16:14:00 +02:00
|
|
|
For arm
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ source ./android-configure-arm NDK_PATH gyp [API_LEVEL]
|
|
|
|
$ make -C out
|
|
|
|
```
|
|
|
|
|
|
|
|
or for arm64
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ source ./android-configure-arm64 NDK_PATH gyp [API_LEVEL]
|
|
|
|
$ make -C out
|
|
|
|
```
|
|
|
|
|
|
|
|
or for x86
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ source ./android-configure-x86 NDK_PATH gyp [API_LEVEL]
|
|
|
|
$ make -C out
|
|
|
|
```
|
|
|
|
|
|
|
|
or for x86_64
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
2018-09-21 16:14:00 +02:00
|
|
|
$ source ./android-configure-x86_64 NDK_PATH gyp [API_LEVEL]
|
2017-09-06 15:59:10 +02:00
|
|
|
$ make -C out
|
|
|
|
```
|
|
|
|
|
|
|
|
The default API level is 24, but a different one can be selected as follows:
|
|
|
|
|
|
|
|
```bash
|
2019-03-16 19:38:18 +01:00
|
|
|
$ source ./android-configure-arm ~/android-ndk-r15b gyp 21
|
2017-07-07 01:12:45 +02:00
|
|
|
$ make -C out
|
|
|
|
```
|
2011-08-06 12:38:11 +02:00
|
|
|
|
2013-02-20 21:12:18 +01:00
|
|
|
Note for UNIX users: compile your project with `-D_LARGEFILE_SOURCE` and
|
|
|
|
`-D_FILE_OFFSET_BITS=64`. GYP builds take care of that automatically.
|
|
|
|
|
2015-05-06 09:46:15 +02:00
|
|
|
### Using Ninja
|
|
|
|
|
|
|
|
To use ninja for build on ninja supported platforms, run:
|
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ ./gyp_uv.py -f ninja
|
|
|
|
$ ninja -C out/Debug #for debug build OR
|
|
|
|
$ ninja -C out/Release
|
|
|
|
```
|
2015-05-06 09:46:15 +02:00
|
|
|
|
|
|
|
|
2013-12-13 19:35:09 +01:00
|
|
|
### Running tests
|
|
|
|
|
2018-09-21 16:14:00 +02:00
|
|
|
#### Build
|
|
|
|
|
|
|
|
Build (includes tests):
|
2013-12-13 19:35:09 +01:00
|
|
|
|
2017-07-07 01:12:45 +02:00
|
|
|
```bash
|
|
|
|
$ ./gyp_uv.py -f make
|
|
|
|
$ make -C out
|
2018-09-21 16:14:00 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
#### Run all tests
|
|
|
|
|
|
|
|
```bash
|
2017-07-07 01:12:45 +02:00
|
|
|
$ ./out/Debug/run-tests
|
|
|
|
```
|
2013-12-13 19:35:09 +01:00
|
|
|
|
2018-09-21 16:14:00 +02:00
|
|
|
#### Run one test
|
|
|
|
|
|
|
|
The list of all tests is in `test/test-list.h`.
|
|
|
|
|
|
|
|
This invocation will cause the `run-tests` driver to fork and execute `TEST_NAME` in a child process:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ ./out/Debug/run-tests TEST_NAME
|
|
|
|
```
|
|
|
|
|
|
|
|
This invocation will cause the `run-tests` driver to execute the test within the `run-tests` process:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ ./out/Debug/run-tests TEST_NAME TEST_NAME
|
|
|
|
```
|
|
|
|
|
|
|
|
#### Debugging tools
|
|
|
|
|
|
|
|
When running the test from within the `run-tests` process (`run-tests TEST_NAME TEST_NAME`), tools like gdb and valgrind work normally.
|
|
|
|
When running the test from a child of the `run-tests` process (`run-tests TEST_NAME`), use these tools in a fork-aware manner.
|
|
|
|
|
|
|
|
##### Fork-aware gdb
|
|
|
|
|
|
|
|
Use the [follow-fork-mode](https://sourceware.org/gdb/onlinedocs/gdb/Forks.html) setting:
|
|
|
|
|
|
|
|
```
|
|
|
|
$ gdb --args out/Debug/run-tests TEST_NAME
|
|
|
|
|
|
|
|
(gdb) set follow-fork-mode child
|
|
|
|
...
|
|
|
|
```
|
|
|
|
|
|
|
|
##### Fork-aware valgrind
|
|
|
|
|
|
|
|
Use the `--trace-children=yes` parameter:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
$ valgrind --trace-children=yes -v --tool=memcheck --leak-check=full --track-origins=yes --leak-resolution=high --show-reachable=yes --log-file=memcheck.log out/Debug/run-tests TEST_NAME
|
|
|
|
```
|
|
|
|
|
|
|
|
### Running benchmarks
|
|
|
|
|
|
|
|
See the section on running tests.
|
|
|
|
The benchmark driver is `out/Debug/run-benchmarks` and the benchmarks are listed in `test/benchmark-list.h`.
|
|
|
|
|
2011-09-23 20:07:57 +02:00
|
|
|
## Supported Platforms
|
2011-05-13 04:16:40 +02:00
|
|
|
|
2016-10-25 04:13:07 +02:00
|
|
|
Check the [SUPPORTED_PLATFORMS file](SUPPORTED_PLATFORMS.md).
|
2015-06-03 21:18:55 +02:00
|
|
|
|
|
|
|
### AIX Notes
|
|
|
|
|
|
|
|
AIX support for filesystem events requires the non-default IBM `bos.ahafs`
|
|
|
|
package to be installed. This package provides the AIX Event Infrastructure
|
|
|
|
that is detected by `autoconf`.
|
|
|
|
[IBM documentation](http://www.ibm.com/developerworks/aix/library/au-aix_event_infrastructure/)
|
|
|
|
describes the package in more detail.
|
|
|
|
|
|
|
|
AIX support for filesystem events is not compiled when building with `gyp`.
|
|
|
|
|
2018-05-08 00:36:08 +02:00
|
|
|
### z/OS Notes
|
|
|
|
|
|
|
|
z/OS creates System V semaphores and message queues. These persist on the system
|
|
|
|
after the process terminates unless the event loop is closed.
|
|
|
|
|
|
|
|
Use the `ipcrm` command to manually clear up System V resources.
|
|
|
|
|
2014-02-27 03:08:30 +01:00
|
|
|
## Patches
|
2013-12-13 19:35:09 +01:00
|
|
|
|
|
|
|
See the [guidelines for contributing][].
|
|
|
|
|
2013-07-16 21:04:31 +02:00
|
|
|
[node.js]: http://nodejs.org/
|
|
|
|
[GYP]: http://code.google.com/p/gyp/
|
2014-11-26 22:37:41 +01:00
|
|
|
[guidelines for contributing]: https://github.com/libuv/libuv/blob/master/CONTRIBUTING.md
|
|
|
|
[libuv_banner]: https://raw.githubusercontent.com/libuv/libuv/master/img/banner.png
|
2016-04-01 11:19:19 +02:00
|
|
|
[x32]: https://en.wikipedia.org/wiki/X32_ABI
|
2017-07-07 01:12:45 +02:00
|
|
|
[Python 2.6 or 2.7]: https://www.python.org/downloads/
|
2018-08-17 04:14:55 +02:00
|
|
|
[Visual C++ Build Tools]: https://visualstudio.microsoft.com/visual-cpp-build-tools/
|
2017-07-07 01:12:45 +02:00
|
|
|
[Visual Studio 2015 Update 3]: https://www.visualstudio.com/vs/older-downloads/
|
|
|
|
[Visual Studio 2017]: https://www.visualstudio.com/downloads/
|
|
|
|
[Git for Windows]: http://git-scm.com/download/win
|