default all feature flags to off (#1811)

Changes the set of `default` feature flags to `[]`. By default, only
core traits are included without specifying feature flags. This makes it
easier for users to pick the components they need.

For convenience, a `full` feature flag is included that includes all
components.

Tests are configured to require the `full` feature. Testing individual
feature flags will need to be moved to a separate crate.

Closes #1791
This commit is contained in:
Carl Lerche 2019-11-22 15:55:10 -08:00 committed by GitHub
parent e1b1e216c5
commit 7b4c999341
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 165 additions and 82 deletions

View File

@ -54,15 +54,13 @@ an asynchronous application.
A basic TCP echo server with Tokio:
```rust
```rust,no_run
use tokio::net::TcpListener;
use tokio::prelude::*;
use std::net::SocketAddr;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr = "127.0.0.1:8080".parse::<SocketAddr>()?;
let mut listener = TcpListener::bind(&addr).await?;
let mut listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
@ -77,14 +75,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Ok(n) if n == 0 => return,
Ok(n) => n,
Err(e) => {
println!("failed to read from socket; err = {:?}", e);
eprintln!("failed to read from socket; err = {:?}", e);
return;
}
};
// Write the data back
if let Err(e) = socket.write_all(&buf[0..n]).await {
println!("failed to write to socket; err = {:?}", e);
eprintln!("failed to write to socket; err = {:?}", e);
return;
}
}

View File

@ -22,14 +22,6 @@ jobs:
- template: azure-is-release.yml
- ${{ each crate in parameters.crates }}:
# Run with default crate features
- script: cargo test
env:
LOOM_MAX_PREEMPTIONS: 2
CI: 'True'
displayName: ${{ crate }} - cargo test
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
# Run with all crate features
- script: cargo test --all-features
env:
@ -41,14 +33,6 @@ jobs:
- template: azure-patch-crates.yml
- ${{ each crate in parameters.crates }}:
# Run with default crate features
- script: cargo test
env:
LOOM_MAX_PREEMPTIONS: 2
CI: 'True'
displayName: ${{ crate }} - cargo test
workingDirectory: $(Build.SourcesDirectory)/${{ crate }}
# Run with all crate features
- script: cargo test --all-features
env:

View File

@ -5,8 +5,8 @@ publish = false
edition = "2018"
[dev-dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio" }
tokio-util = { version = "=0.2.0-alpha.6", path = "../tokio-util" }
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["full"] }
tokio-util = { version = "=0.2.0-alpha.6", path = "../tokio-util", features = ["full"] }
bytes = { git = "https://github.com/tokio-rs/bytes" }
futures = "0.3.0"

View File

@ -6,9 +6,10 @@ edition = "2018"
publish = false
[dependencies]
tokio = { path = "../tokio", features = ["full"] }
doc-comment = "0.3.1"
[dev-dependencies]
tokio = { path = "../tokio" }
tokio-test = { path = "../tokio-test" }
futures = { version = "0.3.0", features = ["async-await"] }

View File

@ -0,0 +1,4 @@
use doc_comment::doc_comment;
// #[doc = include_str!("../../README.md")]
doc_comment!(include_str!("../../README.md"));

View File

@ -29,7 +29,7 @@ quote = "1"
syn = { version = "1.0.3", features = ["full"] }
[dev-dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio" }
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["full"] }
[package.metadata.docs.rs]
all-features = true

View File

@ -20,12 +20,13 @@ Testing utilities for Tokio- and futures-based code
categories = ["asynchronous", "testing"]
[dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["test-util"] }
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["rt-core", "sync", "time", "test-util"] }
bytes = { git = "https://github.com/tokio-rs/bytes" }
futures-core = "0.3.0"
[dev-dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["full"] }
futures-util = "0.3.0"
[package.metadata.docs.rs]

View File

@ -29,6 +29,8 @@ native-tls = "0.2"
tokio = { version = "=0.2.0-alpha.6", path = "../tokio" }
[dev-dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["macros", "stream", "rt-core", "io-util", "net"] }
cfg-if = "0.1"
env_logger = { version = "0.6", default-features = false }
futures = { version = "0.3.0", features = ["async-await"] }

View File

@ -19,6 +19,16 @@ Additional utilities for working with Tokio.
"""
categories = ["asynchronous"]
[features]
# No features on by default
default = []
# Shorthand for enabling everything
full = ["codec", "udp"]
codec = []
udp = ["tokio/udp"]
[dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio" }
@ -29,10 +39,11 @@ log = "0.4"
pin-project-lite = "0.1.1"
[dev-dependencies]
tokio = { version = "=0.2.0-alpha.6", path = "../tokio" }
tokio = { version = "=0.2.0-alpha.6", path = "../tokio", features = ["full"] }
tokio-test = { version = "=0.2.0-alpha.6", path = "../tokio-test" }
futures = "0.3.0"
[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]

19
tokio-util/src/cfg.rs Normal file
View File

@ -0,0 +1,19 @@
macro_rules! cfg_codec {
($($item:item)*) => {
$(
#[cfg(feature = "codec")]
#[cfg_attr(docsrs, doc(cfg(feature = "codec")))]
$item
)*
}
}
macro_rules! cfg_udp {
($($item:item)*) => {
$(
#[cfg(all(feature = "udp", feature = "codec"))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "udp", feature = "codec"))))]
$item
)*
}
}

View File

@ -10,8 +10,17 @@
no_crate_inject,
attr(deny(warnings, rust_2018_idioms), allow(dead_code, unused_variables))
))]
#![cfg_attr(docsrs, feature(doc_cfg))]
//! Utilities for working with Tokio.
pub mod codec;
pub mod udp;
#[macro_use]
mod cfg;
cfg_codec! {
pub mod codec;
}
cfg_udp! {
pub mod udp;
}

View File

@ -27,6 +27,7 @@ use std::task::{Context, Poll};
/// calling `split` on the `UdpFramed` returned by this method, which will break
/// them into separate objects, allowing them to interact more easily.
#[must_use = "sinks do nothing unless polled"]
#[cfg_attr(docsrs, doc(feature = "codec-udp"))]
#[derive(Debug)]
pub struct UdpFramed<C> {
socket: UdpSocket,

View File

@ -24,7 +24,8 @@ categories = ["asynchronous", "network-programming"]
keywords = ["io", "async", "non-blocking", "futures"]
[features]
default = ["full"]
# Include nothing by default
default = []
# enable everything
full = [
@ -48,7 +49,7 @@ full = [
blocking = ["rt-core"]
dns = ["rt-core"]
fs = ["rt-core"]
io-driver = ["rt-core", "mio", "lazy_static"]
io-driver = ["mio", "lazy_static"]
io-util = ["memchr"]
# stdin, stdout, stderr
io-std = ["rt-core"]
@ -83,7 +84,7 @@ stream = ["futures-core"]
sync = ["fnv"]
test-util = []
tcp = ["io-driver"]
time = ["rt-core", "slab"]
time = ["slab"]
udp = ["io-driver"]
uds = ["io-driver", "mio-uds", "libc"]

View File

@ -52,6 +52,15 @@ an asynchronous application.
## Example
To get started, add the following to `Cargo.toml`.
```toml
tokio = { version = "0.2.0", features = ["full"] }
```
Tokio requires components to be explicitly enabled using feature flags. As a
shorthand, the `full` feature enables all components.
A basic TCP echo server with Tokio:
```rust

View File

@ -52,6 +52,13 @@
//! control what features are present, so that unused code can be eliminated.
//! This documentation also lists what feature flags are necessary to enable each API.
//!
//! The easiest way to get started is to enable all features. Do this by
//! enabling the `full` feature flag:
//!
//! ```toml
//! tokio = { version = "0.2", features = ["full"] }
//! ```
//!
//! [features]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section
//!
//! ## Working With Tasks

View File

@ -40,9 +40,11 @@ cfg_not_sync! {
pub(crate) use task::AtomicWaker;
}
cfg_rt_core! {
pub(crate) mod oneshot;
}
#[cfg(any(
feature = "rt-core",
feature = "process",
feature = "signal"))]
pub(crate) mod oneshot;
cfg_signal! {
pub(crate) mod mpsc;

View File

@ -0,0 +1,2 @@
#![cfg(not(feature = "full"))]
compile_error!("run main Tokio tests with `--features full`");

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::TcpListener;
use tokio::prelude::*;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::fs;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::fs::File;
use tokio::prelude::*;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
macro_rules! ready {
($e:expr $(,)?) => {

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::fs;

View File

@ -1,3 +1,6 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncRead;
use tokio_test::task;
use tokio_test::{assert_ready_err, assert_ready_ok};

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::{AsyncRead, AsyncReadExt};
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::TcpListener;
use tokio::runtime;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::TcpListener;
use tokio::runtime;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncBufReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::{AsyncRead, AsyncReadExt};
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncBufReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncBufReadExt;
use tokio_test::assert_ok;

View File

@ -1,3 +1,6 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::{split, AsyncRead, AsyncWrite, ReadHalf, WriteHalf};
use std::io;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncReadExt;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::{AsyncWrite, AsyncWriteExt};
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::{AsyncWrite, AsyncWriteExt};
use tokio_test::assert_ok;

View File

@ -1,3 +1,6 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::TcpListener;
use std::convert::TryFrom;

View File

@ -1,6 +1,6 @@
#![cfg(feature = "process")]
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
use tokio::process::Command;
use tokio::runtime;

View File

@ -1,5 +1,5 @@
#![cfg(feature = "process")]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::process::Command;
use tokio_test::assert_ok;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::runtime::Runtime;
use tokio::sync::oneshot;

View File

@ -1,6 +1,7 @@
// Tests to run on both current-thread & therad-pool runtime variants.
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
// Tests to run on both current-thread & therad-pool runtime variants.
macro_rules! rt_test {
($($t:tt)*) => {

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::{TcpListener, TcpStream};

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
use tokio::signal::unix::{signal, SignalKind};

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
mod support {
pub mod signal;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::sync::Barrier;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
fn is_error<T: ::std::error::Error + Send + Sync>() {}

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::sync::mpsc;
use tokio::sync::mpsc::error::TrySendError;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::sync::Mutex;
use tokio_test::task::spawn;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::sync::oneshot;
use tokio_test::*;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::sync::watch;
use tokio_test::task::spawn;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::{TcpListener, TcpStream};
use tokio::sync::oneshot;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::{TcpListener, TcpStream};
use tokio::sync::oneshot;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::{TcpListener, TcpStream};
use tokio::prelude::*;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncReadExt;
use tokio::net::TcpStream;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::io::AsyncWriteExt;
use tokio::net::{TcpListener, TcpStream};

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::time::{self, Duration, Instant};
use tokio_test::{assert_pending, assert_ready_eq, task};

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::time::*;

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::sync::oneshot;
use tokio::time::{self, timeout, timeout_at, Instant};

View File

@ -1,4 +1,5 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
use tokio::net::UdpSocket;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![cfg(not(target_os = "dragonfly"))]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(all(unix, not(target_os = "dragonfly")))]
use tokio::net::UnixStream;

View File

@ -1,37 +1,11 @@
#![cfg(unix)]
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
use tokio::net::unix::*;
use std::io;
// struct StringDatagramCodec;
// /// A codec to decode datagrams from a unix domain socket as utf-8 text messages.
// impl Encoder for StringDatagramCodec {
// type Item = String;
// type Error = io::Error;
// fn encode(&mut self, item: Self::Item, dst: &mut BytesMut) -> Result<(), Self::Error> {
// dst.extend_from_slice(&item.into_bytes());
// Ok(())
// }
// }
// /// A codec to decode datagrams from a unix domain socket as utf-8 text messages.
// impl Decoder for StringDatagramCodec {
// type Item = String;
// type Error = io::Error;
// fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
// let decoded = str::from_utf8(buf)
// .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?
// .to_string();
// Ok(Some(decoded))
// }
// }
async fn echo_server(mut socket: UnixDatagram) -> io::Result<()> {
let mut recv_buf = vec![0u8; 1024];
loop {

View File

@ -1,5 +1,6 @@
#![warn(rust_2018_idioms)]
#![cfg(feature = "full")]
#![cfg(unix)]
#![deny(warnings, rust_2018_idioms)]
use tokio::net::UnixStream;
use tokio::prelude::*;

View File

@ -1,5 +1,6 @@
#![cfg(unix)]
#![cfg(feature = "full")]
#![warn(rust_2018_idioms)]
#![cfg(unix)]
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::unix::*;