Get a half working example working

Signed-off-by: Marcel Müller <neikos@neikos.email>
This commit is contained in:
Marcel Müller 2025-03-03 15:30:17 +01:00
parent dd7142647f
commit 8bff2cf4cc
13 changed files with 595 additions and 17 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
.direnv
result
target/

378
dylint_driver/Cargo.lock generated Normal file
View file

@ -0,0 +1,378 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "anstream"
version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
[[package]]
name = "anstyle-parse"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [
"windows-sys",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
dependencies = [
"anstyle",
"once_cell",
"windows-sys",
]
[[package]]
name = "anyhow"
version = "1.0.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "colorchoice"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "dylint_driver"
version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4db7cd0e98997a1717c2efae76cb301835cc1a224bad4274837e23fc89846103"
dependencies = [
"anyhow",
"dylint_internal",
"libc",
"libloading",
"log",
"rustversion",
"serde_json",
]
[[package]]
name = "dylint_driver-nix"
version = "0.1.0"
dependencies = [
"anyhow",
"dylint_driver",
"env_logger",
]
[[package]]
name = "dylint_internal"
version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89499236f169dc57ad3c6c8e85eea213efcf743c5a9856ab82522e62512bcff"
dependencies = [
"anyhow",
"log",
"once_cell",
"regex",
]
[[package]]
name = "env_filter"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0"
dependencies = [
"log",
"regex",
]
[[package]]
name = "env_logger"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0"
dependencies = [
"anstream",
"anstyle",
"env_filter",
"humantime",
"log",
]
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itoa"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "libc"
version = "0.2.170"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
[[package]]
name = "libloading"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets",
]
[[package]]
name = "log"
version = "0.4.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "once_cell"
version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]]
name = "proc-macro2"
version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801"
dependencies = [
"proc-macro2",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "rustversion"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
[[package]]
name = "ryu"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]]
name = "serde"
version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.218"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
]
[[package]]
name = "syn"
version = "2.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]]
name = "utf8parse"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"

9
dylint_driver/Cargo.toml Normal file
View file

@ -0,0 +1,9 @@
[package]
name = "dylint_driver-nix"
version = "0.1.0"
edition = "2018"
[dependencies]
anyhow = "1.0"
env_logger = "0.11"
dylint_driver = "4.0.0"

13
dylint_driver/src/main.rs Normal file
View file

@ -0,0 +1,13 @@
#![feature(rustc_private)]
use anyhow::Result;
use std::env;
use std::ffi::OsString;
pub fn main() -> Result<()> {
env_logger::init();
let args: Vec<_> = env::args().map(OsString::from).collect();
dylint_driver::dylint_driver(&args)
}

View file

@ -23,7 +23,16 @@
];
};
rustTarget = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
rustTarget = pkgs.rust-bin.nightly."2025-02-20".default.override {
extensions = [
"rust-src"
"rust-std"
"cargo"
"rustc"
"rustc-dev"
"llvm-tools"
];
};
craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rustTarget;
lib = import ./lib {
@ -38,11 +47,17 @@
packages = lib // {
inherit craneLib;
rust = rustTarget;
drivers = pkgs.runCommandLocal "dylint-drivers" {} ''
mkdir -p $out/nightly-nix
ln -s ${lib.cargo-dylint-driver}/bin/dylint_driver-nix $out/nightly-nix/dylint-driver
'';
};
devShells.default = pkgs.mkShell {
RUSTUP_TOOLCHAIN = "nightly-nix";
nativeBuildInputs = [
pkgs.rust-bin.nightly.latest.default
rustTarget
lib.cargo-dylint
];
};
}

View file

@ -0,0 +1,27 @@
{
craneLib,
}:
let
pname = "cargo-dylint-driver";
version = "4.0.0";
src = ../dylint_driver;
commonArgs = {
inherit pname version src;
strictDeps = true;
RUSTUP_TOOLCHAIN = "nightly-nix";
};
in
craneLib.buildPackage (
commonArgs
// {
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
doNotRemoveReferencesToRustToolchain = true;
}
)

View file

@ -0,0 +1,82 @@
diff --git a/dylint/build.rs b/dylint/build.rs
index f96b676f..297d2dcf 100644
--- a/dylint/build.rs
+++ b/dylint/build.rs
@@ -31,7 +31,7 @@ fn write_dylint_driver_manifest_dir() {
{
"None".to_owned()
} else {
- let path_buf = dylint_manifest_dir.join("../driver");
+ let path_buf = Path::new("@DRIVER_DIR@");
// smoelius: Ensure the path exists at build time.
assert!(path_buf.is_dir(), "{path_buf:?} is not a directory");
diff --git a/internal/src/cargo.rs b/internal/src/cargo.rs
index 8532d68c..4e7f715c 100644
--- a/internal/src/cargo.rs
+++ b/internal/src/cargo.rs
@@ -14,16 +14,7 @@ use std::{
pub use home::cargo_home;
static STABLE_CARGO: Lazy<PathBuf> = Lazy::new(|| {
- let mut command = Command::new("rustup");
- // smoelius: Rustup 1.27.1 doesn't properly handle the case where the toolchain is specified via
- // both the `RUSTUP_TOOLCHAIN` environment variable and the command line (e.g., `+stable`). This
- // bug is fixed in Rustup's `master` branch, though.
- command.env_remove("RUSTUP_TOOLCHAIN");
- command.args(["+stable", "which", "cargo"]);
- let output = command.logged_output(true).unwrap();
- assert!(output.status.success());
- let stdout = String::from_utf8(output.stdout).unwrap();
- PathBuf::from(stdout.trim_end())
+ PathBuf::from("@STABLE_CARGO@")
});
bitflags! {
diff --git a/internal/src/rustup.rs b/internal/src/rustup.rs
index fb72a3fa..9b320670 100644
--- a/internal/src/rustup.rs
+++ b/internal/src/rustup.rs
@@ -15,7 +15,7 @@ impl SanitizeEnvironment for Command {
fn sanitize_environment(&mut self) -> &mut Self {
self.env_remove(env::CARGO);
self.env_remove(env::RUSTC);
- self.env_remove(env::RUSTUP_TOOLCHAIN);
+ // self.env_remove(env::RUSTUP_TOOLCHAIN);
self
}
}
@@ -23,31 +23,11 @@ impl SanitizeEnvironment for Command {
// smoelius: Consider carefully whether you need to call this function! In most cases, the toolchain
// you want is not the one returned by rustup.
pub fn active_toolchain(path: &Path) -> Result<String> {
- let output = Command::new("rustup")
- .sanitize_environment()
- .current_dir(path)
- .args(["show", "active-toolchain"])
- .logged_output(true)?;
- let stdout = std::str::from_utf8(&output.stdout)?;
- stdout
- .split_once(' ')
- .map(|(s, _)| s.to_owned())
- .ok_or_else(|| anyhow!("Could not determine active toolchain"))
+ Ok(String::from("@RUST_TOOLCHAIN@"))
}
pub fn toolchain_path(path: &Path) -> Result<PathBuf> {
- let output = Command::new("rustup")
- .sanitize_environment()
- .current_dir(path)
- .args(["which", "rustc"])
- .logged_output(true)?;
- let stdout = std::str::from_utf8(&output.stdout)?;
- let path = PathBuf::from(stdout);
- // smoelius: `path` should end with `/bin/rustc`.
- path.ancestors()
- .nth(2)
- .map(Into::into)
- .ok_or_else(|| anyhow!("Could not get ancestor"))
+ Ok(PathBuf::from("@RUST_TOOLCHAIN_PATH@"))
}
pub fn is_rustc<T: AsRef<OsStr> + ?Sized>(arg: &T) -> bool {

View file

@ -4,6 +4,8 @@
pkg-config,
openssl,
cargo-dylint-driver,
}:
let
@ -16,14 +18,9 @@ let
tag = "v${version}";
sha256 = "sha256-Z8uuewp7Buoadayc0oTafmfvwNT36KukWKiHxL/mQfI=";
};
in
craneLib.buildPackage {
inherit
pname
version
src
;
commonArgs = {
inherit pname version src;
buildInputs = [
openssl
@ -33,7 +30,32 @@ craneLib.buildPackage {
pkg-config
];
RUSTUP_TOOLCHAIN = craneLib.rustc.version;
RUSTUP_TOOLCHAIN = "nightly-nix";
doCheck = false;
};
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
in
craneLib.buildPackage (
commonArgs
// {
inherit cargoArtifacts;
patches = [ ./cargo-dylint-patch-rustup.patch ];
postPatch = ''
substituteInPlace dylint/build.rs \
--replace-fail @DRIVER_DIR@ ${src}/driver
substituteInPlace internal/src/cargo.rs \
--replace-fail @STABLE_CARGO@ ${craneLib.cargo}/bin/cargo
substituteInPlace internal/src/rustup.rs \
--replace-fail @RUST_TOOLCHAIN@ "nightly-nix" \
--replace-fail @RUST_TOOLCHAIN_PATH@ ${craneLib.rustc}
'';
doNotRemoveReferencesToRustToolchain = true;
}
)

View file

@ -9,6 +9,7 @@ let
callPackage = pkgs.lib.callPackageWith (pkgs // packages // { inherit inputs craneLib; });
packages = {
cargo-dylint = callPackage ./cargo-dylint.nix { };
cargo-dylint-driver = callPackage ./cargo-dylint-driver.nix { };
};
in

View file

@ -1,2 +1,3 @@
[toolchain]
channel = "nightly-2025-03-01"
components = ["rust-src", "rustc-dev", "llvm-tools-preview"]

7
tests/example_lint_target/Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "example_lint_target"
version = "0.1.0"

View file

@ -0,0 +1,6 @@
[package]
name = "example_lint_target"
version = "0.1.0"
edition = "2024"
[dependencies]

View file

@ -0,0 +1,16 @@
#![allow(unused)]
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}