| Alex Crichton | 68fe98b | 2015-01-13 07:53:42 -0800 | [diff] [blame] | 1 | libc |
| 2 | ==== |
| 3 | |
| 4 | A Rust library with native bindings to the types and functions commonly found on |
| 5 | various systems, including libc. |
| 6 | |
| Alex Crichton | be5ad7d | 2015-10-29 17:50:50 -0700 | [diff] [blame] | 7 | [](https://travis-ci.org/rust-lang-nursery/libc) |
| Alex Crichton | bf26024 | 2015-10-29 22:16:32 -0700 | [diff] [blame] | 8 | [](https://ci.appveyor.com/project/alexcrichton/libc) |
| Alex Crichton | 68fe98b | 2015-01-13 07:53:42 -0800 | [diff] [blame] | 9 | |
| Alex Crichton | 5289b31 | 2015-10-29 11:57:58 -0700 | [diff] [blame] | 10 | [Documentation](#platforms-and-documentation) |
| Alex Crichton | 78f5aca | 2015-09-18 15:01:16 -0700 | [diff] [blame] | 11 | |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 12 | ## Usage |
| 13 | |
| 14 | First, add the following to your `Cargo.toml`: |
| 15 | |
| 16 | ```toml |
| 17 | [dependencies] |
| Alex Crichton | 57ba1fa | 2015-11-03 13:23:16 -0800 | [diff] [blame] | 18 | libc = "0.2" |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 19 | ``` |
| 20 | |
| 21 | Next, add this to your crate root: |
| 22 | |
| 23 | ```rust |
| 24 | extern crate libc; |
| 25 | ``` |
| 26 | |
| Alex Crichton | 6d46b6f | 2016-01-20 16:39:37 -0800 | [diff] [blame^] | 27 | Currently libc by default links to the standard library, but if you would |
| 28 | instead like to use libc in a `#![no_std]` situation or crate you can request |
| 29 | this via: |
| 30 | |
| 31 | ```toml |
| 32 | [dependencies] |
| 33 | libc = { version = "0.2", default-features = false } |
| 34 | ``` |
| 35 | |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 36 | ## What is libc? |
| 37 | |
| 38 | The primary purpose of this crate is to provide all of the definitions necessary |
| 39 | to easily interoperate with C code (or "C-like" code) on each of the platforms |
| 40 | that Rust supports. This includes type definitions (e.g. `c_int`), constants |
| 41 | (e.g. `EINVAL`) as well as function headers (e.g. `malloc`). |
| 42 | |
| 43 | This crate does not strive to have any form of compatibility across platforms, |
| 44 | but rather it is simply a straight binding to the system libraries on the |
| 45 | platform in question. |
| 46 | |
| 47 | ## Public API |
| 48 | |
| 49 | This crate exports all underlying platform types, functions, and constants under |
| 50 | the crate root, so all items are accessible as `libc::foo`. The types and values |
| 51 | of all the exported APIs match the platform that libc is compiled for. |
| 52 | |
| Alex Crichton | bbf73de | 2015-10-29 12:28:25 -0700 | [diff] [blame] | 53 | More detailed information about the design of this library can be found in its |
| 54 | [associated RFC][rfc]. |
| 55 | |
| 56 | [rfc]: https://github.com/rust-lang/rfcs/blob/master/text/1291-promote-libc.md |
| 57 | |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 58 | ## Adding an API |
| 59 | |
| 60 | Want to use an API which currently isn't bound in `libc`? It's quite easy to add |
| 61 | one! |
| 62 | |
| 63 | The internal structure of this crate is designed to minimize the number of |
| 64 | `#[cfg]` attributes in order to easily be able to add new items which apply |
| 65 | to all platforms in the future. As a result, the crate is organized |
| 66 | hierarchically based on platform. Each module has a number of `#[cfg]`'d |
| 67 | children, but only one is ever actually compiled. Each module then reexports all |
| 68 | the contents of its children. |
| 69 | |
| 70 | This means that for each platform that libc supports, the path from a |
| 71 | leaf module to the root will contain all bindings for the platform in question. |
| 72 | Consequently, this indicates where an API should be added! Adding an API at a |
| 73 | particular level in the hierarchy means that it is supported on all the child |
| 74 | platforms of that level. For example, when adding a Unix API it should be added |
| 75 | to `src/unix/mod.rs`, but when adding a Linux-only API it should be added to |
| 76 | `src/unix/notbsd/linux/mod.rs`. |
| 77 | |
| 78 | If you're not 100% sure at what level of the hierarchy an API should be added |
| 79 | at, fear not! This crate has CI support which tests any binding against all |
| 80 | platforms supported, so you'll see failures if an API is added at the wrong |
| 81 | level or has different signatures across platforms. |
| 82 | |
| Alex Crichton | 524e137 | 2015-10-29 11:57:29 -0700 | [diff] [blame] | 83 | With that in mind, the steps for adding a new API are: |
| 84 | |
| 85 | 1. Determine where in the module hierarchy your API should be added. |
| 86 | 2. Add the API. |
| 87 | 3. Send a PR to this repo. |
| 88 | 4. Wait for CI to pass, fixing errors. |
| 89 | 5. Wait for a merge! |
| 90 | |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 91 | ## Platforms and Documentation |
| 92 | |
| 93 | The following platforms are currently tested and have documentation available: |
| Alex Crichton | 78f5aca | 2015-09-18 15:01:16 -0700 | [diff] [blame] | 94 | |
| 95 | Tested: |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 96 | * [`i686-pc-windows-msvc`](https://doc.rust-lang.org/libc/i686-pc-windows-msvc/libc) |
| 97 | * [`x86_64-pc-windows-msvc`](https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc/libc) |
| Alex Crichton | b1fbefa | 2015-10-29 11:56:13 -0700 | [diff] [blame] | 98 | (Windows) |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 99 | * [`i686-pc-windows-gnu`](https://doc.rust-lang.org/libc/i686-pc-windows-gnu/libc) |
| 100 | * [`x86_64-pc-windows-gnu`](https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu/libc) |
| 101 | * [`i686-apple-darwin`](https://doc.rust-lang.org/libc/i686-apple-darwin/libc) |
| 102 | * [`x86_64-apple-darwin`](https://doc.rust-lang.org/libc/x86_64-apple-darwin/libc) |
| Alex Crichton | b1fbefa | 2015-10-29 11:56:13 -0700 | [diff] [blame] | 103 | (OSX) |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 104 | * [`i686-apple-ios`](https://doc.rust-lang.org/libc/i686-apple-ios/libc) |
| 105 | * [`x86_64-apple-ios`](https://doc.rust-lang.org/libc/x86_64-apple-ios/libc) |
| Alex Crichton | b1fbefa | 2015-10-29 11:56:13 -0700 | [diff] [blame] | 106 | (iOS) |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 107 | * [`i686-unknown-linux-gnu`](https://doc.rust-lang.org/libc/i686-unknown-linux-gnu/libc) |
| 108 | * [`x86_64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu/libc) |
| Alex Crichton | b1fbefa | 2015-10-29 11:56:13 -0700 | [diff] [blame] | 109 | (Linux) |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 110 | * [`x86_64-unknown-linux-musl`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl/libc) |
| Alex Crichton | b1fbefa | 2015-10-29 11:56:13 -0700 | [diff] [blame] | 111 | (Linux MUSL) |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 112 | * [`aarch64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu/libc) |
| 113 | * [`mips-unknown-linux-gnu`](https://doc.rust-lang.org/libc/mips-unknown-linux-gnu/libc) |
| 114 | * [`arm-unknown-linux-gnueabihf`](https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf/libc) |
| 115 | * [`arm-linux-androideabi`](https://doc.rust-lang.org/libc/arm-linux-androideabi/libc) |
| Alex Crichton | b1fbefa | 2015-10-29 11:56:13 -0700 | [diff] [blame] | 116 | (Android) |
| Alex Crichton | 9522711 | 2016-01-22 13:21:36 -0800 | [diff] [blame] | 117 | * [`x86_64-unknown-freebsd`](http://rust-lang-nursery.github.io/libc/x86_64-unknown-freebsd/libc) |
| 118 | * [`x86_64-unknown-openbsd`](http://rust-lang-nursery.github.io/libc/x86_64-unknown-openbsd/libc) |
| 119 | * [`x86_64-rumprun-netbsd`](http://rust-lang-nursery.github.io/libc/x86_64-unknown-netbsd/libc) |
| Alex Crichton | 78f5aca | 2015-09-18 15:01:16 -0700 | [diff] [blame] | 120 | |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 121 | The following may be supported, but are not guaranteed to always work: |
| 122 | |
| Alex Crichton | 13418a5 | 2015-10-29 11:54:12 -0700 | [diff] [blame] | 123 | * `i686-unknown-freebsd` |
| Alex Crichton | 9522711 | 2016-01-22 13:21:36 -0800 | [diff] [blame] | 124 | * [`x86_64-unknown-bitrig`](http://rust-lang-nursery.github.io/libc/x86_64-unknown-bitrig/libc) |
| 125 | * [`x86_64-unknown-dragonfly`](http://rust-lang-nursery.github.io/libc/x86_64-unknown-dragonfly/libc) |
| 126 | * [`x86_64-unknown-netbsd`](http://rust-lang-nursery.github.io/libc/x86_64-unknown-netbsd/libc) |