about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/base-db/src/lib.rs3
-rw-r--r--crates/cfg/src/lib.rs2
-rw-r--r--crates/flycheck/src/lib.rs2
-rw-r--r--crates/hir-def/src/lib.rs2
-rw-r--r--crates/hir-expand/src/lib.rs2
-rw-r--r--crates/hir-ty/src/lib.rs2
-rw-r--r--crates/hir/src/lib.rs1
-rw-r--r--crates/ide-assists/src/lib.rs3
-rw-r--r--crates/ide-completion/src/lib.rs2
-rw-r--r--crates/ide-db/src/lib.rs2
-rw-r--r--crates/ide-diagnostics/src/lib.rs2
-rw-r--r--crates/ide-ssr/src/lib.rs2
-rw-r--r--crates/ide/src/lib.rs1
-rw-r--r--crates/limit/src/lib.rs2
-rw-r--r--crates/mbe/src/lib.rs2
-rw-r--r--crates/parser/src/lib.rs2
-rw-r--r--crates/paths/src/lib.rs3
-rw-r--r--crates/proc-macro-api/src/lib.rs2
-rw-r--r--crates/proc-macro-srv/src/lib.rs2
-rw-r--r--crates/proc-macro-test/imp/src/lib.rs2
-rw-r--r--crates/proc-macro-test/src/lib.rs2
-rw-r--r--crates/profile/src/lib.rs2
-rw-r--r--crates/project-model/src/lib.rs2
-rw-r--r--crates/rust-analyzer/src/bin/main.rs3
-rw-r--r--crates/rust-analyzer/src/lib.rs2
-rw-r--r--crates/rust-analyzer/tests/slow-tests/main.rs2
-rw-r--r--crates/sourcegen/src/lib.rs2
-rw-r--r--crates/stdx/src/lib.rs3
-rw-r--r--crates/syntax/src/lib.rs2
-rw-r--r--crates/test-utils/src/lib.rs2
-rw-r--r--crates/text-edit/src/lib.rs2
-rw-r--r--crates/toolchain/src/lib.rs3
-rw-r--r--crates/tt/src/lib.rs3
-rw-r--r--crates/vfs-notify/src/lib.rs3
-rw-r--r--crates/vfs/src/lib.rs3
-rw-r--r--lib/la-arena/src/lib.rs1
-rw-r--r--lib/lsp-server/src/lib.rs3
-rw-r--r--xtask/src/main.rs3
38 files changed, 84 insertions, 0 deletions
diff --git a/crates/base-db/src/lib.rs b/crates/base-db/src/lib.rs
index f5622ecf607..f55b82e8ab6 100644
--- a/crates/base-db/src/lib.rs
+++ b/crates/base-db/src/lib.rs
@@ -1,4 +1,7 @@
 //! base_db defines basic database traits. The concrete DB is defined by ide.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod input;
 mod change;
 pub mod fixture;
diff --git a/crates/cfg/src/lib.rs b/crates/cfg/src/lib.rs
index 837b8d4c924..d78ef4fb11e 100644
--- a/crates/cfg/src/lib.rs
+++ b/crates/cfg/src/lib.rs
@@ -1,5 +1,7 @@
 //! cfg defines conditional compiling options, `cfg` attribute parser and evaluator
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod cfg_expr;
 mod dnf;
 #[cfg(test)]
diff --git a/crates/flycheck/src/lib.rs b/crates/flycheck/src/lib.rs
index f683fe61fe3..4e8bc881ae7 100644
--- a/crates/flycheck/src/lib.rs
+++ b/crates/flycheck/src/lib.rs
@@ -2,6 +2,8 @@
 //! another compatible command (f.x. clippy) in a background thread and provide
 //! LSP diagnostics based on the output of the command.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::{
     fmt, io,
     process::{ChildStderr, ChildStdout, Command, Stdio},
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index 4431d1b3c81..0dd0a5861ef 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -7,6 +7,8 @@
 //! Note that `hir_def` is a work in progress, so not all of the above is
 //! actually true.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 #[allow(unused)]
 macro_rules! eprintln {
     ($($tt:tt)*) => { stdx::eprintln!($($tt)*) };
diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs
index 8fcfad20095..252293090bb 100644
--- a/crates/hir-expand/src/lib.rs
+++ b/crates/hir-expand/src/lib.rs
@@ -4,6 +4,8 @@
 //! tree originates not from the text of some `FileId`, but from some macro
 //! expansion.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 pub mod db;
 pub mod ast_id_map;
 pub mod name;
diff --git a/crates/hir-ty/src/lib.rs b/crates/hir-ty/src/lib.rs
index 5abbee89711..125b3d7de86 100644
--- a/crates/hir-ty/src/lib.rs
+++ b/crates/hir-ty/src/lib.rs
@@ -1,6 +1,8 @@
 //! The type system. We currently use this to infer types for completion, hover
 //! information and various assists.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 #[allow(unused)]
 macro_rules! eprintln {
     ($($tt:tt)*) => { stdx::eprintln!($($tt)*) };
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 7e262b4e4cb..327493ccac9 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -17,6 +17,7 @@
 //! from the ide with completions, hovers, etc. It is a (soft, internal) boundary:
 //! <https://www.tedinski.com/2018/02/06/system-boundaries.html>.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
 #![recursion_limit = "512"]
 
 mod semantics;
diff --git a/crates/ide-assists/src/lib.rs b/crates/ide-assists/src/lib.rs
index 7b9134efb48..1a844d96138 100644
--- a/crates/ide-assists/src/lib.rs
+++ b/crates/ide-assists/src/lib.rs
@@ -57,6 +57,9 @@
 //!
 //! See also this post:
 //! <https://rust-analyzer.github.io/blog/2020/09/28/how-to-make-a-light-bulb.html>
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 #[allow(unused)]
 macro_rules! eprintln {
     ($($tt:tt)*) => { stdx::eprintln!($($tt)*) };
diff --git a/crates/ide-completion/src/lib.rs b/crates/ide-completion/src/lib.rs
index b806d955d99..ae1a440d06d 100644
--- a/crates/ide-completion/src/lib.rs
+++ b/crates/ide-completion/src/lib.rs
@@ -1,5 +1,7 @@
 //! `completions` crate provides utilities for generating completions of user input.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod completions;
 mod config;
 mod context;
diff --git a/crates/ide-db/src/lib.rs b/crates/ide-db/src/lib.rs
index 165b98d72ed..e2630d686b7 100644
--- a/crates/ide-db/src/lib.rs
+++ b/crates/ide-db/src/lib.rs
@@ -2,6 +2,8 @@
 //!
 //! It is mainly a `HirDatabase` for semantic analysis, plus a `SymbolsDatabase`, for fuzzy search.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod apply_change;
 
 pub mod active_parameter;
diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs
index eeddd36fb53..daf9b168867 100644
--- a/crates/ide-diagnostics/src/lib.rs
+++ b/crates/ide-diagnostics/src/lib.rs
@@ -23,6 +23,8 @@
 //! There are also a couple of ad-hoc diagnostics implemented directly here, we
 //! don't yet have a great pattern for how to do them properly.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod handlers {
     pub(crate) mod break_outside_of_loop;
     pub(crate) mod inactive_code;
diff --git a/crates/ide-ssr/src/lib.rs b/crates/ide-ssr/src/lib.rs
index 7b4e53ed24a..a5e24daa9fa 100644
--- a/crates/ide-ssr/src/lib.rs
+++ b/crates/ide-ssr/src/lib.rs
@@ -3,6 +3,8 @@
 //! Allows searching the AST for code that matches one or more patterns and then replacing that code
 //! based on a template.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 // Feature: Structural Search and Replace
 //
 // Search and replace with named wildcards that will match any expression, type, path, pattern or item.
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs
index 88dd103f392..dd108fa7999 100644
--- a/crates/ide/src/lib.rs
+++ b/crates/ide/src/lib.rs
@@ -9,6 +9,7 @@
 
 // For proving that RootDatabase is RefUnwindSafe.
 #![recursion_limit = "128"]
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
 
 #[allow(unused)]
 macro_rules! eprintln {
diff --git a/crates/limit/src/lib.rs b/crates/limit/src/lib.rs
index 12228e105c1..3c1da80edb9 100644
--- a/crates/limit/src/lib.rs
+++ b/crates/limit/src/lib.rs
@@ -1,5 +1,7 @@
 //! limit defines a struct to enforce limits.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::sync::atomic::AtomicUsize;
 
 /// Represents a struct used to enforce a numerical limit.
diff --git a/crates/mbe/src/lib.rs b/crates/mbe/src/lib.rs
index 6402ceadaaa..4f09049fdf7 100644
--- a/crates/mbe/src/lib.rs
+++ b/crates/mbe/src/lib.rs
@@ -6,6 +6,8 @@
 //! The tes for this functionality live in another crate:
 //! `hir_def::macro_expansion_tests::mbe`.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod parser;
 mod expander;
 mod syntax_bridge;
diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs
index cff4ca4ba29..203f59407a2 100644
--- a/crates/parser/src/lib.rs
+++ b/crates/parser/src/lib.rs
@@ -16,6 +16,8 @@
 //! Tests for this crate live in the `syntax` crate.
 //!
 //! [`Parser`]: crate::parser::Parser
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
 #![allow(rustdoc::private_intra_doc_links)]
 
 mod lexed_str;
diff --git a/crates/paths/src/lib.rs b/crates/paths/src/lib.rs
index b4beb40e746..025093f4a94 100644
--- a/crates/paths/src/lib.rs
+++ b/crates/paths/src/lib.rs
@@ -1,5 +1,8 @@
 //! Thin wrappers around `std::path`, distinguishing between absolute and
 //! relative paths.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::{
     borrow::Borrow,
     ffi::OsStr,
diff --git a/crates/proc-macro-api/src/lib.rs b/crates/proc-macro-api/src/lib.rs
index 4a30168ca51..dbf2fb37e75 100644
--- a/crates/proc-macro-api/src/lib.rs
+++ b/crates/proc-macro-api/src/lib.rs
@@ -5,6 +5,8 @@
 //! is used to provide basic infrastructure for communication between two
 //! processes: Client (RA itself), Server (the external program)
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 pub mod msg;
 mod process;
 mod version;
diff --git a/crates/proc-macro-srv/src/lib.rs b/crates/proc-macro-srv/src/lib.rs
index 52693547e59..ca7765082f7 100644
--- a/crates/proc-macro-srv/src/lib.rs
+++ b/crates/proc-macro-srv/src/lib.rs
@@ -9,6 +9,8 @@
 //!   RA than `proc-macro2` token stream.
 //! * By **copying** the whole rustc `lib_proc_macro` code, we are able to build this with `stable`
 //!   rustc rather than `unstable`. (Although in general ABI compatibility is still an issue)…
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
 #![allow(unreachable_pub)]
 
 mod dylib;
diff --git a/crates/proc-macro-test/imp/src/lib.rs b/crates/proc-macro-test/imp/src/lib.rs
index 980187a902f..f74d04729ba 100644
--- a/crates/proc-macro-test/imp/src/lib.rs
+++ b/crates/proc-macro-test/imp/src/lib.rs
@@ -1,5 +1,7 @@
 //! Exports a few trivial procedural macros for testing.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use proc_macro::{Group, Ident, Punct, TokenStream, TokenTree};
 
 #[proc_macro]
diff --git a/crates/proc-macro-test/src/lib.rs b/crates/proc-macro-test/src/lib.rs
index 2edf23a6344..6d57bc81e0e 100644
--- a/crates/proc-macro-test/src/lib.rs
+++ b/crates/proc-macro-test/src/lib.rs
@@ -1,4 +1,6 @@
 //! Exports a few trivial procedural macros for testing.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 pub static PROC_MACRO_TEST_LOCATION: &str =
     include_str!(concat!(env!("OUT_DIR"), "/proc_macro_test_location.txt"));
diff --git a/crates/profile/src/lib.rs b/crates/profile/src/lib.rs
index bf9048e935c..00f7952e807 100644
--- a/crates/profile/src/lib.rs
+++ b/crates/profile/src/lib.rs
@@ -1,5 +1,7 @@
 //! A collection of tools for profiling rust-analyzer.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod stop_watch;
 mod memory_usage;
 #[cfg(feature = "cpu_profiler")]
diff --git a/crates/project-model/src/lib.rs b/crates/project-model/src/lib.rs
index 1caf6b59bcd..e3f83084ac8 100644
--- a/crates/project-model/src/lib.rs
+++ b/crates/project-model/src/lib.rs
@@ -15,6 +15,8 @@
 //!   procedural macros).
 //! * Lowering of concrete model to a [`base_db::CrateGraph`]
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod manifest_path;
 mod cargo_workspace;
 mod cfg_flag;
diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs
index 45a3a235548..e9de23cb395 100644
--- a/crates/rust-analyzer/src/bin/main.rs
+++ b/crates/rust-analyzer/src/bin/main.rs
@@ -1,6 +1,9 @@
 //! Driver for rust-analyzer.
 //!
 //! Based on cli flags, either spawns an LSP server, or runs a batch analysis
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod logger;
 mod rustc_wrapper;
 
diff --git a/crates/rust-analyzer/src/lib.rs b/crates/rust-analyzer/src/lib.rs
index e04df7dea42..4b1e0cd5aeb 100644
--- a/crates/rust-analyzer/src/lib.rs
+++ b/crates/rust-analyzer/src/lib.rs
@@ -9,6 +9,8 @@
 //! The `cli` submodule implements some batch-processing analysis, primarily as
 //! a debugging aid.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 pub mod cli;
 
 #[allow(unused)]
diff --git a/crates/rust-analyzer/tests/slow-tests/main.rs b/crates/rust-analyzer/tests/slow-tests/main.rs
index 884224960f5..eef76343dc0 100644
--- a/crates/rust-analyzer/tests/slow-tests/main.rs
+++ b/crates/rust-analyzer/tests/slow-tests/main.rs
@@ -8,6 +8,8 @@
 //! specific JSON shapes here -- there's little value in such tests, as we can't
 //! be sure without a real client anyway.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod sourcegen;
 mod tidy;
 mod testdir;
diff --git a/crates/sourcegen/src/lib.rs b/crates/sourcegen/src/lib.rs
index 2972fc45f84..ce0224ec744 100644
--- a/crates/sourcegen/src/lib.rs
+++ b/crates/sourcegen/src/lib.rs
@@ -6,6 +6,8 @@
 //!
 //! This crate contains utilities to make this kind of source-gen easy.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::{
     fmt, fs, mem,
     path::{Path, PathBuf},
diff --git a/crates/stdx/src/lib.rs b/crates/stdx/src/lib.rs
index 66fa25ec231..b4d45206c44 100644
--- a/crates/stdx/src/lib.rs
+++ b/crates/stdx/src/lib.rs
@@ -1,4 +1,7 @@
 //! Missing batteries for standard libraries.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::process::Command;
 use std::{cmp::Ordering, ops, time::Instant};
 use std::{io as sio, iter};
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index e0309756b8a..7fa354c0c46 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -19,6 +19,8 @@
 //! [RFC]: <https://github.com/rust-lang/rfcs/pull/2256>
 //! [Swift]: <https://github.com/apple/swift/blob/13d593df6f359d0cb2fc81cfaac273297c539455/lib/Syntax/README.md>
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 #[allow(unused)]
 macro_rules! eprintln {
     ($($tt:tt)*) => { stdx::eprintln!($($tt)*) };
diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs
index 4438a12093a..160cf60f9f1 100644
--- a/crates/test-utils/src/lib.rs
+++ b/crates/test-utils/src/lib.rs
@@ -6,6 +6,8 @@
 //! * Extracting markup (mainly, `$0` markers) out of fixture strings.
 //! * marks (see the eponymous module).
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 pub mod bench_fixture;
 mod fixture;
 mod assert_linear;
diff --git a/crates/text-edit/src/lib.rs b/crates/text-edit/src/lib.rs
index 922d24bc754..9bb4271b65f 100644
--- a/crates/text-edit/src/lib.rs
+++ b/crates/text-edit/src/lib.rs
@@ -4,6 +4,8 @@
 //! so `TextEdit` is the ultimate representation of the work done by
 //! rust-analyzer.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use itertools::Itertools;
 use std::cmp::max;
 pub use text_size::{TextRange, TextSize};
diff --git a/crates/toolchain/src/lib.rs b/crates/toolchain/src/lib.rs
index 3b6886f5b57..b05da769161 100644
--- a/crates/toolchain/src/lib.rs
+++ b/crates/toolchain/src/lib.rs
@@ -1,4 +1,7 @@
 //! Discovery of `cargo` & `rustc` executables.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::{env, iter, path::PathBuf};
 
 pub fn cargo() -> PathBuf {
diff --git a/crates/tt/src/lib.rs b/crates/tt/src/lib.rs
index 0316b15038c..845ebfa4dae 100644
--- a/crates/tt/src/lib.rs
+++ b/crates/tt/src/lib.rs
@@ -1,6 +1,9 @@
 //! `tt` crate defines a `TokenTree` data structure: this is the interface (both
 //! input and output) of macros. It closely mirrors `proc_macro` crate's
 //! `TokenTree`.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::fmt;
 
 use stdx::impl_from;
diff --git a/crates/vfs-notify/src/lib.rs b/crates/vfs-notify/src/lib.rs
index b5783cef217..4d33a9afb96 100644
--- a/crates/vfs-notify/src/lib.rs
+++ b/crates/vfs-notify/src/lib.rs
@@ -6,6 +6,9 @@
 //!
 //! Hopefully, one day a reliable file watching/walking crate appears on
 //! crates.io, and we can reduce this to trivial glue code.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 use std::fs;
 
 use crossbeam_channel::{never, select, unbounded, Receiver, Sender};
diff --git a/crates/vfs/src/lib.rs b/crates/vfs/src/lib.rs
index e075d752b7f..10fae41d081 100644
--- a/crates/vfs/src/lib.rs
+++ b/crates/vfs/src/lib.rs
@@ -37,6 +37,9 @@
 //! [`FileSet`]: file_set::FileSet
 //! [`Handle`]: loader::Handle
 //! [`Entries`]: loader::Entry
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod anchored_path;
 pub mod file_set;
 pub mod loader;
diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs
index 9fe6d606234..ce6eebd31eb 100644
--- a/lib/la-arena/src/lib.rs
+++ b/lib/la-arena/src/lib.rs
@@ -1,5 +1,6 @@
 //! Yet another index-based arena.
 
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
 #![warn(missing_docs)]
 
 use std::{
diff --git a/lib/lsp-server/src/lib.rs b/lib/lsp-server/src/lib.rs
index 1aaf327da0f..d567077d4a4 100644
--- a/lib/lsp-server/src/lib.rs
+++ b/lib/lsp-server/src/lib.rs
@@ -3,6 +3,9 @@
 //! control the message dispatch loop yourself.
 //!
 //! Run with `RUST_LOG=lsp_server=debug` to see all the messages.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod msg;
 mod stdio;
 mod error;
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index df726dc23cb..335ac324a57 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -7,6 +7,9 @@
 //!
 //! This binary is integrated into the `cargo` command line by using an alias in
 //! `.cargo/config`.
+
+#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
+
 mod flags;
 
 mod install;