Blame README.md

Packit Service 7c31a4
![libuv][libuv_banner]
Packit Service 7c31a4
Packit Service 7c31a4
## Overview
Packit Service 7c31a4
Packit Service 7c31a4
libuv is a multi-platform support library with a focus on asynchronous I/O. It
Packit Service 7c31a4
was primarily developed for use by [Node.js][], but it's also
Packit Service 7c31a4
used by [Luvit](http://luvit.io/), [Julia](http://julialang.org/),
Packit Service 7c31a4
[pyuv](https://github.com/saghul/pyuv), and [others](https://github.com/libuv/libuv/wiki/Projects-that-use-libuv).
Packit Service 7c31a4
Packit Service 7c31a4
## Feature highlights
Packit Service 7c31a4
Packit Service 7c31a4
 * Full-featured event loop backed by epoll, kqueue, IOCP, event ports.
Packit Service 7c31a4
Packit Service 7c31a4
 * Asynchronous TCP and UDP sockets
Packit Service 7c31a4
Packit Service 7c31a4
 * Asynchronous DNS resolution
Packit Service 7c31a4
Packit Service 7c31a4
 * Asynchronous file and file system operations
Packit Service 7c31a4
Packit Service 7c31a4
 * File system events
Packit Service 7c31a4
Packit Service 7c31a4
 * ANSI escape code controlled TTY
Packit Service 7c31a4
Packit Service 7c31a4
 * IPC with socket sharing, using Unix domain sockets or named pipes (Windows)
Packit Service 7c31a4
Packit Service 7c31a4
 * Child processes
Packit Service 7c31a4
Packit Service 7c31a4
 * Thread pool
Packit Service 7c31a4
Packit Service 7c31a4
 * Signal handling
Packit Service 7c31a4
Packit Service 7c31a4
 * High resolution clock
Packit Service 7c31a4
Packit Service 7c31a4
 * Threading and synchronization primitives
Packit Service 7c31a4
Packit Service 7c31a4
## Versioning
Packit Service 7c31a4
Packit Service 7c31a4
Starting with version 1.0.0 libuv follows the [semantic versioning](http://semver.org/)
Packit Service 7c31a4
scheme. The API change and backwards compatibility rules are those indicated by
Packit Service 7c31a4
SemVer. libuv will keep a stable ABI across major releases.
Packit Service 7c31a4
Packit Service 7c31a4
The ABI/API changes can be tracked [here](http://abi-laboratory.pro/tracker/timeline/libuv/).
Packit Service 7c31a4
Packit Service 7c31a4
## Licensing
Packit Service 7c31a4
Packit Service 7c31a4
libuv is licensed under the MIT license. Check the [LICENSE file](LICENSE).
Packit Service 7c31a4
The documentation is licensed under the CC BY 4.0 license. Check the [LICENSE-docs file](LICENSE-docs).
Packit Service 7c31a4
Packit Service 7c31a4
## Community
Packit Service 7c31a4
Packit Service 7c31a4
 * [Support](https://github.com/libuv/help)
Packit Service 7c31a4
 * [Mailing list](http://groups.google.com/group/libuv)
Packit Service 7c31a4
 * [IRC chatroom (#libuv@irc.freenode.org)](http://webchat.freenode.net?channels=libuv&uio=d4)
Packit Service 7c31a4
Packit Service 7c31a4
## Documentation
Packit Service 7c31a4
Packit Service 7c31a4
### Official documentation
Packit Service 7c31a4
Packit Service 7c31a4
Located in the docs/ subdirectory. It uses the [Sphinx](http://sphinx-doc.org/)
Packit Service 7c31a4
framework, which makes it possible to build the documentation in multiple
Packit Service 7c31a4
formats.
Packit Service 7c31a4
Packit Service 7c31a4
Show different supported building options:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ make help
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Build documentation as HTML:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ make html
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Build documentation as HTML and live reload it when it changes (this requires
Packit Service 7c31a4
sphinx-autobuild to be installed and is only supported on Unix):
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ make livehtml
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Build documentation as man pages:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ make man
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Build documentation as ePub:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ make epub
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
NOTE: Windows users need to use make.bat instead of plain 'make'.
Packit Service 7c31a4
Packit Service 7c31a4
Documentation can be browsed online [here](http://docs.libuv.org).
Packit Service 7c31a4
Packit Service 7c31a4
The [tests and benchmarks](https://github.com/libuv/libuv/tree/master/test)
Packit Service 7c31a4
also serve as API specification and usage examples.
Packit Service 7c31a4
Packit Service 7c31a4
### Other resources
Packit Service 7c31a4
Packit Service 7c31a4
 * [LXJS 2012 talk](http://www.youtube.com/watch?v=nGn60vDSxQ4)
Packit Service 7c31a4
   — High-level introductory talk about libuv.
Packit Service 7c31a4
 * [libuv-dox](https://github.com/thlorenz/libuv-dox)
Packit Service 7c31a4
   — Documenting types and methods of libuv, mostly by reading uv.h.
Packit Service 7c31a4
 * [learnuv](https://github.com/thlorenz/learnuv)
Packit Service 7c31a4
   — Learn uv for fun and profit, a self guided workshop to libuv.
Packit Service 7c31a4
Packit Service 7c31a4
These resources are not handled by libuv maintainers and might be out of
Packit Service 7c31a4
date. Please verify it before opening new issues.
Packit Service 7c31a4
Packit Service 7c31a4
## Downloading
Packit Service 7c31a4
Packit Service 7c31a4
libuv can be downloaded either from the
Packit Service 7c31a4
[GitHub repository](https://github.com/libuv/libuv)
Packit Service 7c31a4
or from the [downloads site](http://dist.libuv.org/dist/).
Packit Service 7c31a4
Packit Service 7c31a4
Before verifying the git tags or signature files, importing the relevant keys
Packit Service 7c31a4
is necessary. Key IDs are listed in the
Packit Service 7c31a4
[MAINTAINERS](https://github.com/libuv/libuv/blob/master/MAINTAINERS.md)
Packit Service 7c31a4
file, but are also available as git blob objects for easier use.
Packit Service 7c31a4
Packit Service 7c31a4
Importing a key the usual way:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ gpg --keyserver pool.sks-keyservers.net --recv-keys AE9BC059
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Importing a key from a git blob object:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ git show pubkey-saghul | gpg --import
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
### Verifying releases
Packit Service 7c31a4
Packit Service 7c31a4
Git tags are signed with the developer's key, they can be verified as follows:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ git verify-tag v1.6.1
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Starting with libuv 1.7.0, the tarballs stored in the
Packit Service 7c31a4
[downloads site](http://dist.libuv.org/dist/) are signed and an accompanying
Packit Service 7c31a4
signature file sit alongside each. Once both the release tarball and the
Packit Service 7c31a4
signature file are downloaded, the file can be verified as follows:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ gpg --verify libuv-1.7.0.tar.gz.sign
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
## Build Instructions
Packit Service 7c31a4
Packit Service 7c31a4
For UNIX-like platforms, including macOS, there are two build methods:
Packit Service 7c31a4
autotools or [CMake][].
Packit Service 7c31a4
Packit Service 7c31a4
For Windows, [CMake][] is the only supported build method and has the
Packit Service 7c31a4
following prerequisites:
Packit Service 7c31a4
Packit Service 7c31a4
<details>
Packit Service 7c31a4
Packit Service 7c31a4
* One of:
Packit Service 7c31a4
  * [Visual C++ Build Tools][]
Packit Service 7c31a4
  * [Visual Studio 2015 Update 3][], all editions
Packit Service 7c31a4
    including the Community edition (remember to select
Packit Service 7c31a4
    "Common Tools for Visual C++ 2015" feature during installation).
Packit Service 7c31a4
  * [Visual Studio 2017][], any edition (including the Build Tools SKU).
Packit Service 7c31a4
    **Required Components:** "MSbuild", "VC++ 2017 v141 toolset" and one of the
Packit Service 7c31a4
    Windows SDKs (10 or 8.1).
Packit Service 7c31a4
* Basic Unix tools required for some tests,
Packit Service 7c31a4
  [Git for Windows][] includes Git Bash
Packit Service 7c31a4
  and tools which can be included in the global `PATH`.
Packit Service 7c31a4
Packit Service 7c31a4
</details>
Packit Service 7c31a4
Packit Service 7c31a4
To build with autotools:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ sh autogen.sh
Packit Service 7c31a4
$ ./configure
Packit Service 7c31a4
$ make
Packit Service 7c31a4
$ make check
Packit Service 7c31a4
$ make install
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
To build with [CMake][]:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ mkdir -p build
Packit Service 7c31a4
Packit Service 7c31a4
$ (cd build && cmake .. -DBUILD_TESTING=ON) # generate project with tests
Packit Service 7c31a4
$ cmake --build build                       # add `-j <n>` with cmake >= 3.12
Packit Service 7c31a4
Packit Service 7c31a4
# Run tests:
Packit Service 7c31a4
$ (cd build && ctest -C Debug --output-on-failure)
Packit Service 7c31a4
Packit Service 7c31a4
# Or manually run tests:
Packit Service 7c31a4
$ build/uv_run_tests                        # shared library build
Packit Service 7c31a4
$ build/uv_run_tests_a                      # static library build
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
To cross-compile with [CMake][] (unsupported but generally works):
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ cmake ../..                 \
Packit Service 7c31a4
  -DCMAKE_SYSTEM_NAME=Windows \
Packit Service 7c31a4
  -DCMAKE_SYSTEM_VERSION=6.1  \
Packit Service 7c31a4
  -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
### Install with Homebrew
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ brew install --HEAD libuv
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
Note to OS X users:
Packit Service 7c31a4
Packit Service 7c31a4
Make sure that you specify the architecture you wish to build for in the
Packit Service 7c31a4
"ARCHS" flag. You can specify more than one by delimiting with a space
Packit Service 7c31a4
(e.g. "x86_64 i386").
Packit Service 7c31a4
Packit Service 7c31a4
### Running tests
Packit Service 7c31a4
Packit Service 7c31a4
Some tests are timing sensitive. Relaxing test timeouts may be necessary
Packit Service 7c31a4
on slow or overloaded machines:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ env UV_TEST_TIMEOUT_MULTIPLIER=2 build/uv_run_tests # 10s instead of 5s
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
#### Run one test
Packit Service 7c31a4
Packit Service 7c31a4
The list of all tests is in `test/test-list.h`.
Packit Service 7c31a4
Packit Service 7c31a4
This invocation will cause the test driver to fork and execute `TEST_NAME` in
Packit Service 7c31a4
a child process:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ build/uv_run_tests_a TEST_NAME
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
This invocation will cause the test driver to execute the test in
Packit Service 7c31a4
the same process:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ build/uv_run_tests_a TEST_NAME TEST_NAME
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
#### Debugging tools
Packit Service 7c31a4
Packit Service 7c31a4
When running the test from within the test driver process
Packit Service 7c31a4
(`build/uv_run_tests_a TEST_NAME TEST_NAME`), tools like gdb and valgrind
Packit Service 7c31a4
work normally.
Packit Service 7c31a4
Packit Service 7c31a4
When running the test from a child of the test driver process
Packit Service 7c31a4
(`build/uv_run_tests_a TEST_NAME`), use these tools in a fork-aware manner.
Packit Service 7c31a4
Packit Service 7c31a4
##### Fork-aware gdb
Packit Service 7c31a4
Packit Service 7c31a4
Use the [follow-fork-mode](https://sourceware.org/gdb/onlinedocs/gdb/Forks.html) setting:
Packit Service 7c31a4
Packit Service 7c31a4
```
Packit Service 7c31a4
$ gdb --args build/uv_run_tests_a TEST_NAME
Packit Service 7c31a4
Packit Service 7c31a4
(gdb) set follow-fork-mode child
Packit Service 7c31a4
...
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
##### Fork-aware valgrind
Packit Service 7c31a4
Packit Service 7c31a4
Use the `--trace-children=yes` parameter:
Packit Service 7c31a4
Packit Service 7c31a4
```bash
Packit Service 7c31a4
$ valgrind --trace-children=yes -v --tool=memcheck --leak-check=full --track-origins=yes --leak-resolution=high --show-reachable=yes --log-file=memcheck-%p.log build/uv_run_tests_a TEST_NAME
Packit Service 7c31a4
```
Packit Service 7c31a4
Packit Service 7c31a4
### Running benchmarks
Packit Service 7c31a4
Packit Service 7c31a4
See the section on running tests.
Packit Service 7c31a4
The benchmark driver is `./uv_run_benchmarks_a` and the benchmarks are
Packit Service 7c31a4
listed in `test/benchmark-list.h`.
Packit Service 7c31a4
Packit Service 7c31a4
## Supported Platforms
Packit Service 7c31a4
Packit Service 7c31a4
Check the [SUPPORTED_PLATFORMS file](SUPPORTED_PLATFORMS.md).
Packit Service 7c31a4
Packit Service 7c31a4
### AIX Notes
Packit Service 7c31a4
Packit Service 7c31a4
AIX compilation using IBM XL C/C++ requires version 12.1 or greater.
Packit Service 7c31a4
Packit Service 7c31a4
AIX support for filesystem events requires the non-default IBM `bos.ahafs`
Packit Service 7c31a4
package to be installed.  This package provides the AIX Event Infrastructure
Packit Service 7c31a4
that is detected by `autoconf`.
Packit Service 7c31a4
[IBM documentation](http://www.ibm.com/developerworks/aix/library/au-aix_event_infrastructure/)
Packit Service 7c31a4
describes the package in more detail.
Packit Service 7c31a4
Packit Service 7c31a4
### z/OS Notes
Packit Service 7c31a4
Packit Service 7c31a4
z/OS creates System V semaphores and message queues. These persist on the system
Packit Service 7c31a4
after the process terminates unless the event loop is closed.
Packit Service 7c31a4
Packit Service 7c31a4
Use the `ipcrm` command to manually clear up System V resources.
Packit Service 7c31a4
Packit Service 7c31a4
## Patches
Packit Service 7c31a4
Packit Service 7c31a4
See the [guidelines for contributing][].
Packit Service 7c31a4
Packit Service 7c31a4
[CMake]: https://cmake.org/
Packit Service 7c31a4
[node.js]: http://nodejs.org/
Packit Service 7c31a4
[guidelines for contributing]: https://github.com/libuv/libuv/blob/master/CONTRIBUTING.md
Packit Service 7c31a4
[libuv_banner]: https://raw.githubusercontent.com/libuv/libuv/master/img/banner.png
Packit Service 7c31a4
[Visual C++ Build Tools]: https://visualstudio.microsoft.com/visual-cpp-build-tools/
Packit Service 7c31a4
[Visual Studio 2015 Update 3]: https://www.visualstudio.com/vs/older-downloads/
Packit Service 7c31a4
[Visual Studio 2017]: https://www.visualstudio.com/downloads/
Packit Service 7c31a4
[Git for Windows]: http://git-scm.com/download/win