Merge branch 'master' into 7656-format-placeholder-code-when-generating-a-crate

This commit is contained in:
Kinrany 2020-02-04 22:46:44 +03:00
commit 68a1c781d5
18 changed files with 332 additions and 156 deletions

View File

@ -1,25 +1,106 @@
# Changelog # Changelog
## Cargo 1.43 (2020-04-23)
[9d32b7b0...HEAD](https://github.com/rust-lang/cargo/compare/9d32b7b0...HEAD)
### Added
- 🔥 Profiles may now be specified in config files (and environment variables).
[#7823](https://github.com/rust-lang/cargo/pull/7823)
### Changed
- `cargo install --git` now honors workspaces in a git repository. This allows
workspace settings, like `[patch]`, `[replace]`, or `[profile]` to be used.
[#7768](https://github.com/rust-lang/cargo/pull/7768)
### Fixed
### Nightly only
- Added `build.out-dir` config variable to set the output directory.
[#7810](https://github.com/rust-lang/cargo/pull/7810)
- Added `-Zjobserver-per-rustc` feature to support improved performance for
parallel rustc.
[#7731](https://github.com/rust-lang/cargo/pull/7731)
## Cargo 1.42 (2020-03-12) ## Cargo 1.42 (2020-03-12)
[0bf7aafe...HEAD](https://github.com/rust-lang/cargo/compare/0bf7aafe...HEAD) [0bf7aafe...rust-1.42.0](https://github.com/rust-lang/cargo/compare/0bf7aafe...rust-1.42.0)
### Added ### Added
- Added documentation on git authentication. - Added documentation on git authentication.
[#7658](https://github.com/rust-lang/cargo/pull/7658) [#7658](https://github.com/rust-lang/cargo/pull/7658)
- Bitbucket Pipeline badges are now supported on crates.io. - Bitbucket Pipeline badges are now supported on crates.io.
[#7663](https://github.com/rust-lang/cargo/pull/7663) [#7663](https://github.com/rust-lang/cargo/pull/7663)
- `cargo vendor` now accepts the `--versioned-dirs` option to force it to
always include the version number in each package's directory name.
[#7631](https://github.com/rust-lang/cargo/pull/7631)
- The `proc_macro` crate is now automatically added to the extern prelude for
proc-macro packages. This means that `extern crate proc_macro;` is no longer
necessary for proc-macros.
[#7700](https://github.com/rust-lang/cargo/pull/7700)
### Changed ### Changed
- Emit a warning if `debug_assertions`, `test`, `proc_macro`, or `feature=` is - Emit a warning if `debug_assertions`, `test`, `proc_macro`, or `feature=` is
used in a `cfg()` expression. used in a `cfg()` expression.
[#7660](https://github.com/rust-lang/cargo/pull/7660) [#7660](https://github.com/rust-lang/cargo/pull/7660)
- Large update to the Cargo documentation, adding new chapters on Cargo
targets, workspaces, and features.
[#7733](https://github.com/rust-lang/cargo/pull/7733)
- Windows: `.lib` DLL import libraries are now copied next to the dll for all
Windows MSVC targets. Previously it was only supported for
`pc-windows-msvc`. This adds DLL support for `uwp-windows-msvc` targets.
[#7758](https://github.com/rust-lang/cargo/pull/7758)
- The `ar` field in the `[target]` configuration is no longer read. It has
been ignored for over 4 years.
[#7763](https://github.com/rust-lang/cargo/pull/7763)
- Bash completion file simplified and updated for latest changes.
[#7789](https://github.com/rust-lang/cargo/pull/7789)
- Credentials are only loaded when needed, instead of every Cargo command.
[#7774](https://github.com/rust-lang/cargo/pull/7774)
### Fixed ### Fixed
- Removed `--offline` empty index check, which was a false positive in some cases. - Removed `--offline` empty index check, which was a false positive in some
cases.
[#7655](https://github.com/rust-lang/cargo/pull/7655) [#7655](https://github.com/rust-lang/cargo/pull/7655)
- Files and directories starting with a `.` can now be included in a package
by adding it to the `include` list.
[#7680](https://github.com/rust-lang/cargo/pull/7680)
- Fixed `cargo login` removing alternative registry tokens when previous
entries existed in the credentials file.
[#7708](https://github.com/rust-lang/cargo/pull/7708)
- Fixed `cargo vendor` from panicking when used with alternative registries.
[#7718](https://github.com/rust-lang/cargo/pull/7718)
- Fixed incorrect explanation in the fingerprint debug log message.
[#7749](https://github.com/rust-lang/cargo/pull/7749)
- A `[source]` that is defined multiple times will now result in an error.
Previously it was randomly picking a source, which could cause
non-deterministic behavior.
[#7751](https://github.com/rust-lang/cargo/pull/7751)
- `dep_kinds` in `cargo metadata` are now de-duplicated.
[#7756](https://github.com/rust-lang/cargo/pull/7756)
- Fixed packaging where `Cargo.lock` was listed in `.gitignore` in a
subdirectory inside a git repository. Previously it was assuming
`Cargo.lock` was at the root of the repo.
[#7779](https://github.com/rust-lang/cargo/pull/7779)
- Partial file transfer errors will now cause an automatic retry.
[#7788](https://github.com/rust-lang/cargo/pull/7788)
- Linux: Fixed panic if CPU iowait stat decreases.
[#7803](https://github.com/rust-lang/cargo/pull/7803)
- Fixed using the wrong sysroot for detecting host compiler settings when
`--sysroot` is passed in via `RUSTFLAGS`.
[#7798](https://github.com/rust-lang/cargo/pull/7798)
### Nightly only ### Nightly only
- `build-std` now uses `--extern` instead of `--sysroot` to find sysroot
pacakges.
[#7699](https://github.com/rust-lang/cargo/pull/7699)
- Added `--config` command-line option to set config settings.
[#7649](https://github.com/rust-lang/cargo/pull/7649)
- Added `include` config setting which allows including another config file.
[#7649](https://github.com/rust-lang/cargo/pull/7649)
- Profiles in config files now support any named profile. Previously it was
limited to dev/release.
[#7750](https://github.com/rust-lang/cargo/pull/7750)
## Cargo 1.41 (2020-01-30) ## Cargo 1.41 (2020-01-30)
[5da4b4d4...rust-1.41.0](https://github.com/rust-lang/cargo/compare/5da4b4d4...rust-1.41.0) [5da4b4d4...rust-1.41.0](https://github.com/rust-lang/cargo/compare/5da4b4d4...rust-1.41.0)

View File

@ -1,6 +1,6 @@
[package] [package]
name = "cargo" name = "cargo"
version = "0.43.0" version = "0.44.0"
edition = "2018" edition = "2018"
authors = ["Yehuda Katz <wycats@gmail.com>", authors = ["Yehuda Katz <wycats@gmail.com>",
"Carl Lerche <me@carllerche.com>", "Carl Lerche <me@carllerche.com>",

View File

@ -61,7 +61,7 @@ proptest! {
config config
.configure( .configure(
1, 1,
None, false,
None, None,
false, false,
false, false,
@ -569,7 +569,7 @@ fn test_resolving_minimum_version_with_transitive_deps() {
config config
.configure( .configure(
1, 1,
None, false,
None, None,
false, false,
false, false,

View File

@ -36,7 +36,6 @@ Available unstable (nightly-only) flags:
-Z minimal-versions -- Install minimal dependency versions instead of maximum -Z minimal-versions -- Install minimal dependency versions instead of maximum
-Z no-index-update -- Do not update the registry, avoids a network request for benchmarking -Z no-index-update -- Do not update the registry, avoids a network request for benchmarking
-Z unstable-options -- Allow the usage of unstable options -Z unstable-options -- Allow the usage of unstable options
-Z config-profile -- Read profiles from .cargo/config files
-Z timings -- Display concurrency information -Z timings -- Display concurrency information
-Z doctest-xcompile -- Compile and run doctests for non-host target using runner config -Z doctest-xcompile -- Compile and run doctests for non-host target using runner config
@ -92,8 +91,11 @@ Run with 'cargo -Z [FLAG] [SUBCOMMAND]'"
return Ok(()); return Ok(());
} }
let args = expand_aliases(config, args)?; // Global args need to be extracted before expanding aliases because the
let (cmd, subcommand_args) = match args.subcommand() { // clap code for extracting a subcommand discards global options
// (appearing before the subcommand).
let (expanded_args, global_args) = expand_aliases(config, args)?;
let (cmd, subcommand_args) = match expanded_args.subcommand() {
(cmd, Some(args)) => (cmd, args), (cmd, Some(args)) => (cmd, args),
_ => { _ => {
// No subcommand provided. // No subcommand provided.
@ -101,7 +103,7 @@ Run with 'cargo -Z [FLAG] [SUBCOMMAND]'"
return Ok(()); return Ok(());
} }
}; };
config_configure(config, &args, subcommand_args)?; config_configure(config, &expanded_args, subcommand_args, global_args)?;
super::init_git_transports(config); super::init_git_transports(config);
execute_subcommand(config, cmd, subcommand_args) execute_subcommand(config, cmd, subcommand_args)
@ -129,7 +131,7 @@ pub fn get_version_string(is_verbose: bool) -> String {
fn expand_aliases( fn expand_aliases(
config: &mut Config, config: &mut Config,
args: ArgMatches<'static>, args: ArgMatches<'static>,
) -> Result<ArgMatches<'static>, CliError> { ) -> Result<(ArgMatches<'static>, GlobalArgs), CliError> {
if let (cmd, Some(args)) = args.subcommand() { if let (cmd, Some(args)) = args.subcommand() {
match ( match (
commands::builtin_exec(cmd), commands::builtin_exec(cmd),
@ -148,41 +150,60 @@ fn expand_aliases(
.unwrap_or_default() .unwrap_or_default()
.map(|s| s.to_string()), .map(|s| s.to_string()),
); );
let args = cli() // new_args strips out everything before the subcommand, so
// capture those global options now.
// Note that an alias to an external command will not receive
// these arguments. That may be confusing, but such is life.
let global_args = GlobalArgs::new(&args);
let new_args = cli()
.setting(AppSettings::NoBinaryName) .setting(AppSettings::NoBinaryName)
.get_matches_from_safe(alias)?; .get_matches_from_safe(alias)?;
return expand_aliases(config, args); let (expanded_args, _) = expand_aliases(config, new_args)?;
return Ok((expanded_args, global_args));
} }
(_, None) => {} (_, None) => {}
} }
}; };
Ok(args) Ok((args, GlobalArgs::default()))
} }
fn config_configure( fn config_configure(
config: &mut Config, config: &mut Config,
args: &ArgMatches<'_>, args: &ArgMatches<'_>,
subcommand_args: &ArgMatches<'_>, subcommand_args: &ArgMatches<'_>,
global_args: GlobalArgs,
) -> CliResult { ) -> CliResult {
let arg_target_dir = &subcommand_args.value_of_path("target-dir", config); let arg_target_dir = &subcommand_args.value_of_path("target-dir", config);
let config_args: Vec<&str> = args.values_of("config").unwrap_or_default().collect(); let verbose = global_args.verbose + args.occurrences_of("verbose") as u32;
let quiet = if args.is_present("quiet") || subcommand_args.is_present("quiet") { // quiet is unusual because it is redefined in some subcommands in order
Some(true) // to provide custom help text.
} else { let quiet =
None args.is_present("quiet") || subcommand_args.is_present("quiet") || global_args.quiet;
}; let global_color = global_args.color; // Extract so it can take reference.
let color = args
.value_of("color")
.or_else(|| global_color.as_ref().map(|s| s.as_ref()));
let frozen = args.is_present("frozen") || global_args.frozen;
let locked = args.is_present("locked") || global_args.locked;
let offline = args.is_present("offline") || global_args.offline;
let mut unstable_flags = global_args.unstable_flags;
if let Some(values) = args.values_of("unstable-features") {
unstable_flags.extend(values.map(|s| s.to_string()));
}
let mut config_args = global_args.config_args;
if let Some(values) = args.values_of("config") {
config_args.extend(values.map(|s| s.to_string()));
}
config.configure( config.configure(
args.occurrences_of("verbose") as u32, verbose,
quiet, quiet,
args.value_of("color"), color,
args.is_present("frozen"), frozen,
args.is_present("locked"), locked,
args.is_present("offline"), offline,
arg_target_dir, arg_target_dir,
&args &unstable_flags,
.values_of_lossy("unstable-features")
.unwrap_or_default(),
&config_args, &config_args,
)?; )?;
Ok(()) Ok(())
@ -202,6 +223,39 @@ fn execute_subcommand(
super::execute_external_subcommand(config, cmd, &ext_args) super::execute_external_subcommand(config, cmd, &ext_args)
} }
#[derive(Default)]
struct GlobalArgs {
verbose: u32,
quiet: bool,
color: Option<String>,
frozen: bool,
locked: bool,
offline: bool,
unstable_flags: Vec<String>,
config_args: Vec<String>,
}
impl GlobalArgs {
fn new(args: &ArgMatches<'_>) -> GlobalArgs {
GlobalArgs {
verbose: args.occurrences_of("verbose") as u32,
quiet: args.is_present("quiet"),
color: args.value_of("color").map(|s| s.to_string()),
frozen: args.is_present("frozen"),
locked: args.is_present("locked"),
offline: args.is_present("offline"),
unstable_flags: args
.values_of_lossy("unstable-features")
.unwrap_or_default(),
config_args: args
.values_of("config")
.unwrap_or_default()
.map(|s| s.to_string())
.collect(),
}
}
}
fn cli() -> App { fn cli() -> App {
App::new("cargo") App::new("cargo")
.settings(&[ .settings(&[

View File

@ -39,8 +39,6 @@ pub struct TargetInfo {
pub rustflags: Vec<String>, pub rustflags: Vec<String>,
/// Extra flags to pass to `rustdoc`, see `env_args`. /// Extra flags to pass to `rustdoc`, see `env_args`.
pub rustdocflags: Vec<String>, pub rustdocflags: Vec<String>,
// Remove this when it hits stable (1.41).
pub supports_pathless_extern: Option<bool>,
} }
/// Kind of each file generated by a Unit, part of `FileType`. /// Kind of each file generated by a Unit, part of `FileType`.
@ -103,13 +101,6 @@ impl TargetInfo {
.args(&rustflags) .args(&rustflags)
.env_remove("RUSTC_LOG"); .env_remove("RUSTC_LOG");
let mut pathless_test = process.clone();
pathless_test.args(&["--extern", "proc_macro"]);
let supports_pathless_extern = match kind {
CompileKind::Host => Some(rustc.cached_output(&pathless_test).is_ok()),
_ => None,
};
if let CompileKind::Target(target) = kind { if let CompileKind::Target(target) = kind {
process.arg("--target").arg(target.rustc_target()); process.arg("--target").arg(target.rustc_target());
} }
@ -192,7 +183,6 @@ impl TargetInfo {
"RUSTDOCFLAGS", "RUSTDOCFLAGS",
)?, )?,
cfg, cfg,
supports_pathless_extern,
}) })
} }

View File

@ -1018,13 +1018,7 @@ pub fn extern_args<'a>(
link_to(dep, dep.extern_crate_name, dep.noprelude)?; link_to(dep, dep.extern_crate_name, dep.noprelude)?;
} }
} }
if unit.target.proc_macro() if unit.target.proc_macro() {
&& cx
.bcx
.info(CompileKind::Host)
.supports_pathless_extern
.unwrap()
{
// Automatically import `proc_macro`. // Automatically import `proc_macro`.
result.push(OsString::from("--extern")); result.push(OsString::from("--extern"));
result.push(OsString::from("proc_macro")); result.push(OsString::from("proc_macro"));

View File

@ -331,7 +331,6 @@ pub struct CliUnstable {
pub minimal_versions: bool, pub minimal_versions: bool,
pub package_features: bool, pub package_features: bool,
pub advanced_env: bool, pub advanced_env: bool,
pub config_profile: bool,
pub config_include: bool, pub config_include: bool,
pub dual_proc_macros: bool, pub dual_proc_macros: bool,
pub mtime_on_use: bool, pub mtime_on_use: bool,
@ -397,7 +396,6 @@ impl CliUnstable {
"minimal-versions" => self.minimal_versions = parse_empty(k, v)?, "minimal-versions" => self.minimal_versions = parse_empty(k, v)?,
"package-features" => self.package_features = parse_empty(k, v)?, "package-features" => self.package_features = parse_empty(k, v)?,
"advanced-env" => self.advanced_env = parse_empty(k, v)?, "advanced-env" => self.advanced_env = parse_empty(k, v)?,
"config-profile" => self.config_profile = parse_empty(k, v)?,
"config-include" => self.config_include = parse_empty(k, v)?, "config-include" => self.config_include = parse_empty(k, v)?,
"dual-proc-macros" => self.dual_proc_macros = parse_empty(k, v)?, "dual-proc-macros" => self.dual_proc_macros = parse_empty(k, v)?,
// can also be set in .cargo/config or with and ENV // can also be set in .cargo/config or with and ENV

View File

@ -908,13 +908,9 @@ fn merge_config_profiles(
}; };
// List of profile names to check if defined in config only. // List of profile names to check if defined in config only.
let mut check_to_add = vec![requested_profile]; let mut check_to_add = vec![requested_profile];
// Flag so -Zconfig-profile warning is only printed once.
let mut unstable_warned = false;
// Merge config onto manifest profiles. // Merge config onto manifest profiles.
for (name, profile) in &mut profiles { for (name, profile) in &mut profiles {
if let Some(config_profile) = if let Some(config_profile) = get_config_profile(name, config, features)? {
get_config_profile(name, config, features, &mut unstable_warned)?
{
profile.merge(&config_profile); profile.merge(&config_profile);
} }
if let Some(inherits) = &profile.inherits { if let Some(inherits) = &profile.inherits {
@ -928,9 +924,7 @@ fn merge_config_profiles(
std::mem::swap(&mut current, &mut check_to_add); std::mem::swap(&mut current, &mut check_to_add);
for name in current.drain(..) { for name in current.drain(..) {
if !profiles.contains_key(&name) { if !profiles.contains_key(&name) {
if let Some(config_profile) = if let Some(config_profile) = get_config_profile(&name, config, features)? {
get_config_profile(&name, config, features, &mut unstable_warned)?
{
if let Some(inherits) = &config_profile.inherits { if let Some(inherits) = &config_profile.inherits {
check_to_add.push(*inherits); check_to_add.push(*inherits);
} }
@ -947,20 +941,12 @@ fn get_config_profile(
name: &str, name: &str,
config: &Config, config: &Config,
features: &Features, features: &Features,
unstable_warned: &mut bool,
) -> CargoResult<Option<TomlProfile>> { ) -> CargoResult<Option<TomlProfile>> {
let profile: Option<config::Value<TomlProfile>> = config.get(&format!("profile.{}", name))?; let profile: Option<config::Value<TomlProfile>> = config.get(&format!("profile.{}", name))?;
let profile = match profile { let profile = match profile {
Some(profile) => profile, Some(profile) => profile,
None => return Ok(None), None => return Ok(None),
}; };
if !*unstable_warned && !config.cli_unstable().config_profile {
config.shell().warn(format!(
"config profiles require the `-Z config-profile` command-line option (found profile `{}` in {})",
name, profile.definition))?;
*unstable_warned = true;
return Ok(None);
}
let mut warnings = Vec::new(); let mut warnings = Vec::new();
profile profile
.val .val

View File

@ -602,14 +602,14 @@ impl Config {
pub fn configure( pub fn configure(
&mut self, &mut self,
verbose: u32, verbose: u32,
quiet: Option<bool>, quiet: bool,
color: Option<&str>, color: Option<&str>,
frozen: bool, frozen: bool,
locked: bool, locked: bool,
offline: bool, offline: bool,
target_dir: &Option<PathBuf>, target_dir: &Option<PathBuf>,
unstable_flags: &[String], unstable_flags: &[String],
cli_config: &[&str], cli_config: &[String],
) -> CargoResult<()> { ) -> CargoResult<()> {
self.unstable_flags.parse(unstable_flags)?; self.unstable_flags.parse(unstable_flags)?;
if !cli_config.is_empty() { if !cli_config.is_empty() {
@ -618,7 +618,7 @@ impl Config {
self.merge_cli_args()?; self.merge_cli_args()?;
} }
let extra_verbose = verbose >= 2; let extra_verbose = verbose >= 2;
let verbose = if verbose == 0 { None } else { Some(true) }; let verbose = verbose != 0;
#[derive(Deserialize, Default)] #[derive(Deserialize, Default)]
struct TermConfig { struct TermConfig {
@ -632,25 +632,19 @@ impl Config {
let color = color.or_else(|| term.color.as_ref().map(|s| s.as_ref())); let color = color.or_else(|| term.color.as_ref().map(|s| s.as_ref()));
let verbosity = match (verbose, term.verbose, quiet) { let verbosity = match (verbose, term.verbose, quiet) {
(Some(true), _, None) | (None, Some(true), None) => Verbosity::Verbose, (true, _, false) | (_, Some(true), false) => Verbosity::Verbose,
// Command line takes precedence over configuration, so ignore the // Command line takes precedence over configuration, so ignore the
// configuration.. // configuration..
(None, _, Some(true)) => Verbosity::Quiet, (false, _, true) => Verbosity::Quiet,
// Can't pass both at the same time on the command line regardless // Can't pass both at the same time on the command line regardless
// of configuration. // of configuration.
(Some(true), _, Some(true)) => { (true, _, true) => {
bail!("cannot set both --verbose and --quiet"); bail!("cannot set both --verbose and --quiet");
} }
// Can't actually get `Some(false)` as a value from the command (false, _, false) => Verbosity::Normal,
// line, so just ignore them here to appease exhaustiveness checking
// in match statements.
(Some(false), _, _)
| (_, _, Some(false))
| (None, Some(false), None)
| (None, None, None) => Verbosity::Normal,
}; };
let cli_target_dir = match target_dir.as_ref() { let cli_target_dir = match target_dir.as_ref() {
@ -659,7 +653,7 @@ impl Config {
}; };
self.shell().set_verbosity(verbosity); self.shell().set_verbosity(verbosity);
self.shell().set_color_choice(color.map(|s| &s[..]))?; self.shell().set_color_choice(color)?;
self.extra_verbose = extra_verbose; self.extra_verbose = extra_verbose;
self.frozen = frozen; self.frozen = frozen;
self.locked = locked; self.locked = locked;

View File

@ -87,6 +87,21 @@ retry = 2 # network retries
git-fetch-with-cli = true # use the `git` executable for git operations git-fetch-with-cli = true # use the `git` executable for git operations
offline = false # do not access the network offline = false # do not access the network
[profile.<name>] # Modify profile settings via config.
opt-level = 0 # Optimization level.
debug = true # Include debug info.
debug-assertions = true # Enables debug assertions.
overflow-checks = true # Enables runtime integer overflow checks.
lto = false # Sets link-time optimization.
panic = 'unwind' # The panic strategy.
incremental = true # Incremental compilation.
codegen-units = 16 # Number of code generation units.
rpath = false # Sets the rpath linking option.
[profile.<name>.build-override] # Overrides build-script settings.
# Same keys for a normal profile.
[profile.<name>.package.<name>] # Override profile for a package.
# Same keys for a normal profile (minus `panic`, `lto`, and `rpath`).
[registries.<name>] # registries other than crates.io [registries.<name>] # registries other than crates.io
index = "…" # URL of the registry index index = "…" # URL of the registry index
token = "…" # authentication token for the registry token = "…" # authentication token for the registry
@ -549,6 +564,93 @@ needed, and generate an error if it encounters a network error.
Can be overridden with the `--offline` command-line option. Can be overridden with the `--offline` command-line option.
#### `[profile]`
The `[profile]` table can be used to globally change profile settings, and
override settings specified in `Cargo.toml`. It has the same syntax and
options as profiles specified in `Cargo.toml`. See the [Profiles chapter] for
details about the options.
[Profiles chapter]: profiles.md
##### `[profile.<name>.build-override]`
* Environment: `CARGO_PROFILE_<name>_BUILD_OVERRIDE_<key>`
The build-override table overrides settings for build scripts, proc macros,
and their dependencies. It has the same keys as a normal profile. See the
[overrides section](profiles.md#overrides) for more details.
##### `[profile.<name>.package.<name>]`
* Environment: not supported
The package table overrides settings for specific packages. It has the same
keys as a normal profile, minus the `panic`, `lto`, and `rpath` settings. See
the [overrides section](profiles.md#overrides) for more details.
##### `profile.<name>.codegen-units`
* Type: integer
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_CODEGEN_UNITS`
See [codegen-units](profiles.md#codegen-units).
##### `profile.<name>.debug`
* Type: integer or boolean
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_DEBUG`
See [debug](profiles.md#debug).
##### `profile.<name>.debug-assertions`
* Type: boolean
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_DEBUG_ASSERTIONS`
See [debug-assertions](profiles.md#debug-assertions).
##### `profile.<name>.incremental`
* Type: boolean
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_INCREMENTAL`
See [incremental](profiles.md#incremental).
##### `profile.<name>.lto`
* Type: string or boolean
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_LTO`
See [lto](profiles.md#lto).
##### `profile.<name>.overflow-checks`
* Type: boolean
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_OVERFLOW_CHECKS`
See [overflow-checks](profiles.md#overflow-checks).
##### `profile.<name>.opt-level`
* Type: integer or string
* Default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_OPT_LEVEL`
See [opt-level](profiles.md#opt-level).
##### `profile.<name>.panic`
* Type: string
* default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_PANIC`
See [panic](profiles.md#panic).
##### `profile.<name>.rpath`
* Type: boolean
* default: See profile docs.
* Environment: `CARGO_PROFILE_<name>_RPATH`
See [rpath](profiles.md#rpath).
#### `[registries]` #### `[registries]`
The `[registries]` table is used for specifying additional [registries]. It The `[registries]` table is used for specifying additional [registries]. It

View File

@ -84,6 +84,16 @@ supported environment variables are:
* `CARGO_NET_RETRY` — Number of times to retry network errors, see [`net.retry`]. * `CARGO_NET_RETRY` — Number of times to retry network errors, see [`net.retry`].
* `CARGO_NET_GIT_FETCH_WITH_CLI` — Enables the use of the `git` executable to fetch, see [`net.git-fetch-with-cli`]. * `CARGO_NET_GIT_FETCH_WITH_CLI` — Enables the use of the `git` executable to fetch, see [`net.git-fetch-with-cli`].
* `CARGO_NET_OFFLINE` — Offline mode, see [`net.offline`]. * `CARGO_NET_OFFLINE` — Offline mode, see [`net.offline`].
* `CARGO_PROFILE_<name>_BUILD_OVERRIDE_<key>` Override build script profile, see [`profile.<name>.build-override`].
* `CARGO_PROFILE_<name>_CODEGEN_UNITS` Set code generation units, see [`profile.<name>.codegen-units`].
* `CARGO_PROFILE_<name>_DEBUG` What kind of debug info to include, see [`profile.<name>.debug`].
* `CARGO_PROFILE_<name>_DEBUG_ASSERTIONS` — Enable/disable debug assertions, see [`profile.<name>.debug-assertions`].
* `CARGO_PROFILE_<name>_INCREMENTAL` Enable/disable incremental compilation, see [`profile.<name>.incremental`].
* `CARGO_PROFILE_<name>_LTO` Link-time optimization, see [`profile.<name>.lto`].
* `CARGO_PROFILE_<name>_OVERFLOW_CHECKS` Enable/disable overflow checks, see [`profile.<name>.overflow-checks`].
* `CARGO_PROFILE_<name>_OPT_LEVEL` Set the optimization level, see [`profile.<name>.opt-level`].
* `CARGO_PROFILE_<name>_PANIC` The panic strategy to use, see [`profile.<name>.panic`].
* `CARGO_PROFILE_<name>_RPATH` The rpath linking option, see [`profile.<name>.rpath`].
* `CARGO_REGISTRIES_<name>_INDEX` — URL of a registry index, see [`registries.<name>.index`]. * `CARGO_REGISTRIES_<name>_INDEX` — URL of a registry index, see [`registries.<name>.index`].
* `CARGO_REGISTRIES_<name>_TOKEN` — Authentication token of a registry, see [`registries.<name>.token`]. * `CARGO_REGISTRIES_<name>_TOKEN` — Authentication token of a registry, see [`registries.<name>.token`].
* `CARGO_REGISTRY_DEFAULT` — Default registry for the `--registry` flag, see [`registry.default`]. * `CARGO_REGISTRY_DEFAULT` — Default registry for the `--registry` flag, see [`registry.default`].
@ -129,6 +139,16 @@ supported environment variables are:
[`net.retry`]: config.md#netretry [`net.retry`]: config.md#netretry
[`net.git-fetch-with-cli`]: config.md#netgit-fetch-with-cli [`net.git-fetch-with-cli`]: config.md#netgit-fetch-with-cli
[`net.offline`]: config.md#netoffline [`net.offline`]: config.md#netoffline
[`profile.<name>.build-override`]: config.md#profilenamebuild-override
[`profile.<name>.codegen-units`]: config.md#profilenamecodegen-units
[`profile.<name>.debug`]: config.md#profilenamedebug
[`profile.<name>.debug-assertions`]: config.md#profilenamedebug-assertions
[`profile.<name>.incremental`]: config.md#profilenameincremental
[`profile.<name>.lto`]: config.md#profilenamelto
[`profile.<name>.overflow-checks`]: config.md#profilenameoverflow-checks
[`profile.<name>.opt-level`]: config.md#profilenameopt-level
[`profile.<name>.panic`]: config.md#profilenamepanic
[`profile.<name>.rpath`]: config.md#profilenamerpath
[`registries.<name>.index`]: config.md#registriesnameindex [`registries.<name>.index`]: config.md#registriesnameindex
[`registries.<name>.token`]: config.md#registriesnametoken [`registries.<name>.token`]: config.md#registriesnametoken
[`registry.default`]: config.md#registrydefault [`registry.default`]: config.md#registrydefault

View File

@ -22,6 +22,12 @@ Cargo only looks at the profile settings in the `Cargo.toml` manifest at the
root of the workspace. Profile settings defined in dependencies will be root of the workspace. Profile settings defined in dependencies will be
ignored. ignored.
Additionally, profiles can be overridden from a [config] definition.
Specifying a profile in a config file or environment variable will override
the settings from `Cargo.toml`.
[config]: config.md
### Profile settings ### Profile settings
The following is a list of settings that can be controlled in a profile. The following is a list of settings that can be controlled in a profile.
@ -393,5 +399,4 @@ crates. When experimenting with optimizing dependencies for development,
consider trying opt-level 1, which will apply some optimizations while still consider trying opt-level 1, which will apply some optimizations while still
allowing monomorphized items to be shared. allowing monomorphized items to be shared.
[nalgebra]: https://crates.io/crates/nalgebra [nalgebra]: https://crates.io/crates/nalgebra

View File

@ -158,26 +158,6 @@ lto = true
``` ```
### Config Profiles
* Tracking Issue: [rust-lang/rust#48683](https://github.com/rust-lang/rust/issues/48683)
* RFC: [#2282](https://github.com/rust-lang/rfcs/blob/master/text/2282-profile-dependencies.md)
Profiles can be specified in `.cargo/config` files. The `-Z config-profile`
command-line flag is required to use this feature. The format is the same as
in a `Cargo.toml` manifest. If found in multiple config files, settings will
be merged using the regular [config hierarchy](config.md#hierarchical-structure).
Config settings take precedence over manifest settings.
```toml
[profile.dev]
opt-level = 3
```
```
cargo +nightly build -Z config-profile
```
### Namespaced features ### Namespaced features
* Original issue: [#1286](https://github.com/rust-lang/cargo/issues/1286) * Original issue: [#1286](https://github.com/rust-lang/cargo/issues/1286)
* Tracking Issue: [#5565](https://github.com/rust-lang/cargo/issues/5565) * Tracking Issue: [#5565](https://github.com/rust-lang/cargo/issues/5565)

View File

@ -176,3 +176,19 @@ fn builtin_alias_takes_options() {
p.cargo("r --example ex1 -- asdf").with_stdout("asdf").run(); p.cargo("r --example ex1 -- asdf").with_stdout("asdf").run();
} }
#[cargo_test]
fn global_options_with_alias() {
// Check that global options are passed through.
let p = project().file("src/lib.rs", "").build();
p.cargo("-v c")
.with_stderr(
"\
[CHECKING] foo [..]
[RUNNING] `rustc [..]
[FINISHED] dev [..]
",
)
.run();
}

View File

@ -76,17 +76,16 @@ impl ConfigBuilder {
let homedir = paths::home(); let homedir = paths::home();
let mut config = Config::new(shell, cwd, homedir); let mut config = Config::new(shell, cwd, homedir);
config.set_env(self.env.clone()); config.set_env(self.env.clone());
let config_args: Vec<&str> = self.config_args.iter().map(AsRef::as_ref).collect();
config.configure( config.configure(
0, 0,
None, false,
None, None,
false, false,
false, false,
false, false,
&None, &None,
&self.unstable, &self.unstable,
&config_args, &self.config_args,
)?; )?;
Ok(config) Ok(config)
} }

View File

@ -443,10 +443,6 @@ Caused by:
#[cargo_test] #[cargo_test]
fn proc_macro_extern_prelude() { fn proc_macro_extern_prelude() {
if !is_nightly() {
// remove once pathless `--extern` hits stable (1.41)
return;
}
// Check that proc_macro is in the extern prelude. // Check that proc_macro is in the extern prelude.
let p = project() let p = project()
.file( .file(

View File

@ -3,31 +3,6 @@
use cargo_test_support::paths::CargoPathExt; use cargo_test_support::paths::CargoPathExt;
use cargo_test_support::{basic_lib_manifest, paths, project}; use cargo_test_support::{basic_lib_manifest, paths, project};
#[cargo_test]
fn profile_config_gated() {
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev]
debug = 1
"#,
)
.build();
p.cargo("build -v")
.with_stderr_contains(
"\
[WARNING] config profiles require the `-Z config-profile` command-line option \
(found profile `dev` in [..]/foo/.cargo/config)
",
)
.with_stderr_contains("[..]-C debuginfo=2[..]")
.run();
}
#[cargo_test] #[cargo_test]
fn named_profile_gated() { fn named_profile_gated() {
// Named profile in config requires enabling in Cargo.toml. // Named profile in config requires enabling in Cargo.toml.
@ -42,7 +17,7 @@ fn named_profile_gated() {
"#, "#,
) )
.build(); .build();
p.cargo("build --profile foo -Zunstable-options -Zconfig-profile") p.cargo("build --profile foo -Zunstable-options")
.masquerade_as_nightly_cargo() .masquerade_as_nightly_cargo()
.with_stderr( .with_stderr(
"\ "\
@ -84,8 +59,7 @@ fn profile_config_validate_warnings() {
) )
.build(); .build();
p.cargo("build -Z config-profile") p.cargo("build")
.masquerade_as_nightly_cargo()
.with_stderr_unordered( .with_stderr_unordered(
"\ "\
[WARNING] unused config key `profile.dev.bad-key` in `[..].cargo/config` [WARNING] unused config key `profile.dev.bad-key` in `[..].cargo/config`
@ -120,8 +94,7 @@ fn profile_config_error_paths() {
) )
.build(); .build();
p.cargo("build -Z config-profile") p.cargo("build")
.masquerade_as_nightly_cargo()
.with_status(101) .with_status(101)
.with_stderr( .with_stderr(
"\ "\
@ -148,8 +121,7 @@ fn profile_config_validate_errors() {
) )
.build(); .build();
p.cargo("build -Z config-profile") p.cargo("build")
.masquerade_as_nightly_cargo()
.with_status(101) .with_status(101)
.with_stderr( .with_stderr(
"\ "\
@ -176,8 +148,7 @@ fn profile_config_syntax_errors() {
) )
.build(); .build();
p.cargo("build -Z config-profile") p.cargo("build")
.masquerade_as_nightly_cargo()
.with_status(101) .with_status(101)
.with_stderr( .with_stderr(
"\ "\
@ -221,8 +192,7 @@ fn profile_config_override_spec_multiple() {
// Unfortunately this doesn't tell you which file, hopefully it's not too // Unfortunately this doesn't tell you which file, hopefully it's not too
// much of a problem. // much of a problem.
p.cargo("build -v -Z config-profile") p.cargo("build -v")
.masquerade_as_nightly_cargo()
.with_status(101) .with_status(101)
.with_stderr( .with_stderr(
"\ "\
@ -254,8 +224,7 @@ fn profile_config_all_options() {
) )
.build(); .build();
p.cargo("build --release -v -Z config-profile") p.cargo("build --release -v")
.masquerade_as_nightly_cargo()
.env_remove("CARGO_INCREMENTAL") .env_remove("CARGO_INCREMENTAL")
.with_stderr( .with_stderr(
"\ "\
@ -309,8 +278,7 @@ fn profile_config_override_precedence() {
) )
.build(); .build();
p.cargo("build -v -Z config-profile") p.cargo("build -v")
.masquerade_as_nightly_cargo()
.with_stderr( .with_stderr(
"\ "\
[COMPILING] bar [..] [COMPILING] bar [..]
@ -336,8 +304,7 @@ fn profile_config_no_warn_unknown_override() {
) )
.build(); .build();
p.cargo("build -Z config-profile") p.cargo("build")
.masquerade_as_nightly_cargo()
.with_stderr_does_not_contain("[..]warning[..]") .with_stderr_does_not_contain("[..]warning[..]")
.run(); .run();
} }
@ -363,8 +330,7 @@ fn profile_config_mixed_types() {
) )
.build(); .build();
p.cargo("build -v -Z config-profile") p.cargo("build -v")
.masquerade_as_nightly_cargo()
.with_stderr_contains("[..]-C opt-level=3 [..]") .with_stderr_contains("[..]-C opt-level=3 [..]")
.run(); .run();
} }
@ -406,7 +372,7 @@ fn named_config_profile() {
"#, "#,
) )
.unwrap(); .unwrap();
let config = ConfigBuilder::new().unstable_flag("config-profile").build(); let config = ConfigBuilder::new().build();
let mut warnings = Vec::new(); let mut warnings = Vec::new();
let features = Features::new(&["named-profiles".to_string()], &mut warnings).unwrap(); let features = Features::new(&["named-profiles".to_string()], &mut warnings).unwrap();
assert_eq!(warnings.len(), 0); assert_eq!(warnings.len(), 0);
@ -481,7 +447,7 @@ fn named_env_profile() {
.file("src/lib.rs", "") .file("src/lib.rs", "")
.build(); .build();
p.cargo("build -v -Zconfig-profile -Zunstable-options --profile=other") p.cargo("build -v -Zunstable-options --profile=other")
.masquerade_as_nightly_cargo() .masquerade_as_nightly_cargo()
.env("CARGO_PROFILE_OTHER_CODEGEN_UNITS", "1") .env("CARGO_PROFILE_OTHER_CODEGEN_UNITS", "1")
.env("CARGO_PROFILE_OTHER_INHERITS", "dev") .env("CARGO_PROFILE_OTHER_INHERITS", "dev")

View File

@ -6,11 +6,6 @@ use std::env;
#[cargo_test] #[cargo_test]
fn rustc_info_cache() { fn rustc_info_cache() {
if !cargo_test_support::is_nightly() {
// remove once pathless `--extern` hits stable (1.41)
return;
}
let p = project() let p = project()
.file("src/main.rs", r#"fn main() { println!("hello"); }"#) .file("src/main.rs", r#"fn main() { println!("hello"); }"#)
.build(); .build();