From d4865d55d8b9b8b9b84ccd8f62d119199205c67c Mon Sep 17 00:00:00 2001 From: Nathan Regner Date: Sun, 2 Feb 2025 11:14:05 -0700 Subject: [PATCH 1/4] chore: fix lints --- cli/src/main.rs | 5 +++-- cli/src/manifest.rs | 4 ++-- cli/src/registry/mod.rs | 12 +++--------- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index cd7fe50..5b1a75c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -39,10 +39,11 @@ impl Args { return Ok(core_dir.to_owned()); } - if let Some(core_dir) = env::var("PLATFORMIO_CORE_DIR").ok() { + if let Ok(core_dir) = env::var("PLATFORMIO_CORE_DIR") { return Ok(PathBuf::from(core_dir)); } + #[expect(deprecated)] // nix doesn't support Windows anyway if let Some(home_dir) = env::home_dir() { return Ok(home_dir.join(".platformio")); } @@ -55,7 +56,7 @@ impl Args { return Ok(Some(workspace_dir.to_owned())); } - if let Some(workspace_dir) = env::var("PLATFORMIO_WORKSPACE_DIR").ok() { + if let Ok(workspace_dir) = env::var("PLATFORMIO_WORKSPACE_DIR") { return Ok(Some(PathBuf::from(workspace_dir))); } diff --git a/cli/src/manifest.rs b/cli/src/manifest.rs index 39cc164..9e98298 100644 --- a/cli/src/manifest.rs +++ b/cli/src/manifest.rs @@ -70,7 +70,7 @@ pub struct ExternalSpec { pub fn extract_artifacts(root: &Path) -> eyre::Result> { let mut artifacts = vec![]; - extract_artifacts_rec(&mut artifacts, &root, &root)?; + extract_artifacts_rec(&mut artifacts, root, root)?; Ok(artifacts) } @@ -88,7 +88,7 @@ fn extract_artifacts_rec( let piopm = path.join(".piopm"); if !piopm.exists() { - extract_artifacts_rec(artifacts, &root, &path)?; + extract_artifacts_rec(artifacts, root, &path)?; continue; } diff --git a/cli/src/registry/mod.rs b/cli/src/registry/mod.rs index 3d48903..5f561d1 100644 --- a/cli/src/registry/mod.rs +++ b/cli/src/registry/mod.rs @@ -1,5 +1,3 @@ -use std::path::PathBuf; - use color_eyre::eyre::{self, Context}; use http_cache_reqwest::{CACacheManager, Cache, CacheMode, HttpCache, HttpCacheOptions}; use reqwest::{Client, Url}; @@ -12,7 +10,7 @@ use sha2::{Digest, Sha256}; use crate::{ lockfile::Dependency, - manifest::{Artifact, ExternalSpec, PackageManifest, PackageType, PlatformIOSpec}, + manifest::{ExternalSpec, PackageManifest, PackageType, PlatformIOSpec}, }; pub struct RegistryClient { @@ -131,16 +129,12 @@ pub struct PackageSpec { #[derive(Deserialize, Clone, Debug)] pub struct VersionSpec { - pub name: String, pub files: Vec, } impl VersionSpec { pub fn supports(&self, system: &System) -> Option<&File> { - self.files - .iter() - .filter(|f| f.system.supports(system)) - .next() + self.files.iter().find(|f| f.system.supports(system)) } } @@ -179,7 +173,7 @@ impl SystemSpec { pub fn supports(&self, system: &System) -> bool { match self { SystemSpec::Wildcard => true, - SystemSpec::Systems(systems) => systems.contains(&system), + SystemSpec::Systems(systems) => systems.contains(system), } } } From 30ead0ab114e415d3837403c35837d938b14f950 Mon Sep 17 00:00:00 2001 From: Nathan Regner Date: Sat, 1 Feb 2025 20:43:06 -0700 Subject: [PATCH 2/4] build: run on self-hosted for now magic-nix-cache-action has been deprecated, and getting a permission denied error on ubuntu-latest --- .github/workflows/check.yml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 79df975..a0f2f67 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -8,30 +8,23 @@ on: jobs: cli: - runs-on: ubuntu-latest + runs-on: self-hosted steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@main - - uses: DeterminateSystems/nix-installer-action@b92f66560d6f97d6576405a7bae901ab57e72b6a # pin@main - # with: - # nix-installer-tag: v0.16.1 # https://github.com/DeterminateSystems/nix-installer/tags - - uses: DeterminateSystems/magic-nix-cache-action@a76a83091cd8728db8c37312dbdd0eeb1177a6c0 # pin@main - - uses: DeterminateSystems/flake-checker-action@078f5f7f47ee188aa6cb472527ca5984e195222d # pin@main + - uses: actions/checkout@85e6279cec87321a52edac9c87bce653a07cf6c2 # pin@main - name: Check flake run: nix flake check examples: - runs-on: ubuntu-latest + runs-on: self-hosted strategy: + fail-fast: false matrix: example: - external-deps - marlin + - multi-env steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@main - - uses: DeterminateSystems/nix-installer-action@b92f66560d6f97d6576405a7bae901ab57e72b6a # pin@main - # with: - # nix-installer-tag: v0.16.1 # https://github.com/DeterminateSystems/nix-installer/tags - - uses: DeterminateSystems/magic-nix-cache-action@a76a83091cd8728db8c37312dbdd0eeb1177a6c0 # pin@main + - uses: actions/checkout@85e6279cec87321a52edac9c87bce653a07cf6c2 # pin@main - name: Check flake working-directory: examples/${{ matrix.example }} run: nix flake check From cc98255005dae495afea24bf833f31606c168caa Mon Sep 17 00:00:00 2001 From: Nathan Regner Date: Sat, 1 Feb 2025 13:45:08 -0700 Subject: [PATCH 3/4] fix!: rework lockfile to handle libdeps installed in multiple environments fixes #8 --- cli/src/lockfile.rs | 107 +++---- cli/src/main.rs | 7 +- cli/src/manifest.rs | 8 +- cli/src/registry/mod.rs | 32 +- examples/external-deps/package.nix | 2 +- examples/external-deps/platformio2nix.lock | 230 +++++++------- examples/marlin/.gitignore | 1 + examples/marlin/package.nix | 3 +- examples/marlin/platformio2nix.lock | 156 ++++----- examples/multi-env/flake.nix | 37 +++ examples/multi-env/package.nix | 40 +++ examples/multi-env/platformio.ini | 29 ++ examples/multi-env/platformio2nix.lock | 351 +++++++++++++++++++++ examples/multi-env/src/main.cpp | 6 + setup-hook.nix | 111 ++++--- 15 files changed, 783 insertions(+), 337 deletions(-) create mode 100644 examples/marlin/.gitignore create mode 100644 examples/multi-env/flake.nix create mode 100644 examples/multi-env/package.nix create mode 100644 examples/multi-env/platformio.ini create mode 100644 examples/multi-env/platformio2nix.lock create mode 100644 examples/multi-env/src/main.cpp diff --git a/cli/src/lockfile.rs b/cli/src/lockfile.rs index 102e6a7..7306820 100644 --- a/cli/src/lockfile.rs +++ b/cli/src/lockfile.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, fmt::Display, path::PathBuf}; +use std::{collections::BTreeMap, fmt::Display}; use base64::prelude::*; use serde::{Deserialize, Serialize}; @@ -6,34 +6,35 @@ use url::Url; use crate::{ manifest::{ExternalSpec, PackageManifest}, - registry, + registry::{self, SystemSpec}, }; #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(tag = "version")] pub enum Lockfile { - V1 { + #[serde(rename = "2")] + V2 { dependencies: BTreeMap, }, } impl Default for Lockfile { fn default() -> Self { - Self::V1 { + Self::V2 { dependencies: BTreeMap::default(), } } } impl Lockfile { - pub fn add_dependency(&mut self, dependency: Dependency) { - let Self::V1 { dependencies, .. } = self; - if let Some(old) = dependencies.insert(dependency.name.clone(), dependency) { - let new = &dependencies[&old.name]; + pub fn add_dependency(&mut self, install_path: String, dependency: Dependency) { + let Self::V2 { dependencies, .. } = self; + if let Some(old) = dependencies.insert(install_path.clone(), dependency) { + let new = &dependencies[&install_path]; if old.manifest != new.manifest { log::warn!(r#"Found duplicate dependency "{old}", using "{new}"#) } - } + }; } } @@ -69,74 +70,58 @@ impl NixSystem { #[derive(Serialize, Deserialize, Clone, Debug)] pub struct Dependency { pub name: String, - pub install_path: PathBuf, - pub version: String, - pub manifest: String, - pub systems: BTreeMap, + pub manifest: PackageManifest, + pub src: Src, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] +pub enum Src { + Universal(FetchUrl), + Systems(BTreeMap), } impl Dependency { - pub fn from_url( - manifest: &PackageManifest, - install_path: PathBuf, - package_spec: &ExternalSpec, - sha256: &[u8], - ) -> Self { - let systems = NixSystem::ALL - .iter() - .map(|nix_system| (*nix_system, FetchUrl::new(package_spec.uri.clone(), sha256))) - .collect(); - Self::new( - manifest, - install_path, - package_spec.name.clone(), - manifest.version.clone(), - systems, - ) + pub fn from_url(manifest: PackageManifest, package_spec: &ExternalSpec, sha256: &[u8]) -> Self { + let src = Src::Universal(FetchUrl::new(package_spec.uri.clone(), sha256)); + Self::new(manifest, package_spec.name.clone(), src) } - pub fn from_registry( - manifest: &PackageManifest, - install_path: PathBuf, - package_spec: registry::PackageSpec, - ) -> Self { - let version = package_spec.version; - let systems = NixSystem::ALL + pub fn from_registry(manifest: PackageManifest, package_spec: registry::PackageSpec) -> Self { + let src = if let Some(universal) = package_spec + .version + .files .iter() - .filter_map(|nix_system| { - let file = version.supports(&nix_system.to_registry()); - file.map(|file| (*nix_system, FetchUrl::from(file))) - }) - .collect(); - Self::new( - manifest, - install_path, - package_spec.name, - version.name.clone(), - systems, - ) + .find(|f| f.system == SystemSpec::Wildcard) + { + Src::Universal(FetchUrl::from(universal)) + } else { + Src::Systems( + NixSystem::ALL + .iter() + .filter_map(|nix_system| { + let file = package_spec.version.supports(&nix_system.to_registry()); + file.map(|file| (*nix_system, FetchUrl::from(file))) + }) + .collect(), + ) + }; + + Self::new(manifest, package_spec.name, src) } - fn new( - manifest: &PackageManifest, - install_path: PathBuf, - name: String, - version: String, - systems: BTreeMap, - ) -> Self { + fn new(manifest: PackageManifest, name: String, src: Src) -> Self { Self { name, - install_path, - manifest: serde_json::to_string(manifest).expect("serializable manifest"), - version, - systems, + manifest, + src, } } } impl Display for Dependency { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}@{}", self.name, self.version) + write!(f, "{}@{}", self.name, self.manifest.version) } } diff --git a/cli/src/main.rs b/cli/src/main.rs index 5b1a75c..f49dc6e 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -100,8 +100,11 @@ async fn main() -> eyre::Result<()> { let mut lockfile = Lockfile::default(); for artifact in global.into_iter().chain(workspace.into_iter()) { - let dependency = client.resolve(artifact).await?; - lockfile.add_dependency(dependency); + let dependency = client.resolve(artifact.manifest).await?; + lockfile.add_dependency( + artifact.install_path.to_string_lossy().into_owned(), + dependency, + ); } println!("{}", serde_json::to_string_pretty(&lockfile)?); diff --git a/cli/src/manifest.rs b/cli/src/manifest.rs index 9e98298..21af373 100644 --- a/cli/src/manifest.rs +++ b/cli/src/manifest.rs @@ -15,7 +15,7 @@ pub struct Artifact { } /// .piopm package manifest file -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)] pub struct PackageManifest { #[serde(rename = "type")] pub ty: PackageType, @@ -45,14 +45,14 @@ impl PackageType { } } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)] #[serde(untagged)] pub enum PackageSpec { PlatformIO(PlatformIOSpec), External(ExternalSpec), } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)] pub struct PlatformIOSpec { pub owner: String, pub name: String, @@ -60,7 +60,7 @@ pub struct PlatformIOSpec { _extra: BTreeMap, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)] pub struct ExternalSpec { pub name: String, pub uri: Url, diff --git a/cli/src/registry/mod.rs b/cli/src/registry/mod.rs index 5f561d1..8ccc17d 100644 --- a/cli/src/registry/mod.rs +++ b/cli/src/registry/mod.rs @@ -40,34 +40,23 @@ impl Default for RegistryClient { } impl RegistryClient { - pub async fn resolve(&self, artifact: Artifact) -> eyre::Result { - match &artifact.manifest.spec { + pub async fn resolve(&self, manifest: PackageManifest) -> eyre::Result { + match &manifest.spec { crate::manifest::PackageSpec::PlatformIO(PlatformIOSpec { owner, name, .. }) => { let package_spec = self - .get_package_spec( - owner, - artifact.manifest.ty, - name, - Some(artifact.manifest.version.to_string()), - ) + .get_package_spec(owner, manifest.ty, name, Some(manifest.version.to_string())) .await?; - Ok(Dependency::from_registry( - &artifact.manifest, - artifact.install_path, - package_spec, - )) + Ok(Dependency::from_registry(manifest, package_spec)) } crate::manifest::PackageSpec::External(package_spec) => { - self.get_external(&artifact.manifest, artifact.install_path, package_spec) - .await + self.get_external(&manifest, package_spec).await } } } - pub async fn get_external( + async fn get_external( &self, manifest: &PackageManifest, - install_path: PathBuf, package_spec: &ExternalSpec, ) -> eyre::Result { let response = self.client.get(package_spec.uri.clone()).send().await?; @@ -76,15 +65,10 @@ impl RegistryClient { let mut hash = Sha256::new(); hash.update(bytes); let hash = hash.finalize(); - Ok(Dependency::from_url( - manifest, - install_path, - package_spec, - &hash, - )) + Ok(Dependency::from_url(manifest.clone(), package_spec, &hash)) } - pub async fn get_package_spec( + async fn get_package_spec( &self, owner: &str, ty: PackageType, diff --git a/examples/external-deps/package.nix b/examples/external-deps/package.nix index f657bd0..ad493e0 100644 --- a/examples/external-deps/package.nix +++ b/examples/external-deps/package.nix @@ -13,7 +13,7 @@ let lockfile = ./platformio2nix.lock; overrides = ( final: prev: { - SlowSoftWire = prev.SlowSoftWire.overrideAttrs (drv: { + "libdeps/uno/SlowSoftWire" = prev."libdeps/uno/SlowSoftWire".overrideAttrs (drv: { nativeBuildInputs = [ libarchive ]; unpackPhase = '' diff --git a/examples/external-deps/platformio2nix.lock b/examples/external-deps/platformio2nix.lock index 58f1fe9..e79b7b3 100644 --- a/examples/external-deps/platformio2nix.lock +++ b/examples/external-deps/platformio2nix.lock @@ -1,147 +1,143 @@ { - "version": "V1", + "version": "2", "dependencies": { - "SlowSoftI2CMaster": { + "libdeps/uno/SlowSoftI2CMaster": { "name": "SlowSoftI2CMaster", - "install_path": "libdeps/uno/SlowSoftI2CMaster", - "version": "1.0.0", - "manifest": "{\"type\":\"library\",\"version\":\"1.0.0\",\"spec\":{\"owner\":\"felias-fogg\",\"name\":\"SlowSoftI2CMaster\",\"id\":7005,\"requirements\":null,\"uri\":null},\"name\":\"SlowSoftI2CMaster\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/felias-fogg/library/SlowSoftI2CMaster/1.0.0/SlowSoftI2CMaster-1.0.0.tar.gz", - "hash": "sha256-DVPlZAOtAd0/zMgiKk76A0pGyI2MHGSbZsgvJAjt/bY=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/felias-fogg/library/SlowSoftI2CMaster/1.0.0/SlowSoftI2CMaster-1.0.0.tar.gz", - "hash": "sha256-DVPlZAOtAd0/zMgiKk76A0pGyI2MHGSbZsgvJAjt/bY=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/felias-fogg/library/SlowSoftI2CMaster/1.0.0/SlowSoftI2CMaster-1.0.0.tar.gz", - "hash": "sha256-DVPlZAOtAd0/zMgiKk76A0pGyI2MHGSbZsgvJAjt/bY=" - }, - "x86_64-darwin": { + "manifest": { + "type": "library", + "version": "1.0.0", + "spec": { + "owner": "felias-fogg", + "name": "SlowSoftI2CMaster", + "id": 7005, + "requirements": null, + "uri": null + }, + "name": "SlowSoftI2CMaster" + }, + "src": { + "universal": { "url": "https://dl.registry.platformio.org/download/felias-fogg/library/SlowSoftI2CMaster/1.0.0/SlowSoftI2CMaster-1.0.0.tar.gz", "hash": "sha256-DVPlZAOtAd0/zMgiKk76A0pGyI2MHGSbZsgvJAjt/bY=" } } }, - "SlowSoftWire": { + "libdeps/uno/SlowSoftWire": { "name": "SlowSoftWire", - "install_path": "libdeps/uno/SlowSoftWire", - "version": "0.0.0+20241026221146", - "manifest": "{\"type\":\"library\",\"version\":\"0.0.0+20241026221146\",\"spec\":{\"name\":\"SlowSoftWire\",\"uri\":\"https://github.com/felias-fogg/SlowSoftWire/archive/f34d777f39.zip\",\"id\":null,\"owner\":null,\"requirements\":null},\"name\":\"SlowSoftWire\"}", - "systems": { - "aarch64-linux": { - "url": "https://github.com/felias-fogg/SlowSoftWire/archive/f34d777f39.zip", - "hash": "sha256-FhoHDjfPYRlWeJZig5cz12iPYbL6j0bEivR1+qNmXLc=" - }, - "aarch64-darwin": { - "url": "https://github.com/felias-fogg/SlowSoftWire/archive/f34d777f39.zip", - "hash": "sha256-FhoHDjfPYRlWeJZig5cz12iPYbL6j0bEivR1+qNmXLc=" - }, - "x86_64-linux": { + "manifest": { + "type": "library", + "version": "0.0.0+20250201135053", + "spec": { + "name": "SlowSoftWire", + "uri": "https://github.com/felias-fogg/SlowSoftWire/archive/f34d777f39.zip", + "id": null, + "owner": null, + "requirements": null + }, + "name": "SlowSoftWire" + }, + "src": { + "universal": { "url": "https://github.com/felias-fogg/SlowSoftWire/archive/f34d777f39.zip", "hash": "sha256-FhoHDjfPYRlWeJZig5cz12iPYbL6j0bEivR1+qNmXLc=" - }, - "x86_64-darwin": { - "url": "https://github.com/felias-fogg/SlowSoftWire/archive/f34d777f39.zip", - "hash": "sha256-FhoHDjfPYRlWeJZig5cz12iPYbL6j0bEivR1+qNmXLc=" - } - } - }, - "atmelavr": { - "name": "atmelavr", - "install_path": "platforms/atmelavr", - "version": "5.1.0", - "manifest": "{\"type\":\"platform\",\"version\":\"5.1.0\",\"spec\":{\"owner\":\"platformio\",\"name\":\"atmelavr\",\"id\":8006,\"requirements\":null,\"uri\":null},\"name\":\"atmelavr\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/5.1.0/atmelavr-5.1.0.tar.gz", - "hash": "sha256-0XGSJi0KwN04/98qUTlzkmYtm1K95fc4JWJoYIhLQhk=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/5.1.0/atmelavr-5.1.0.tar.gz", - "hash": "sha256-0XGSJi0KwN04/98qUTlzkmYtm1K95fc4JWJoYIhLQhk=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/5.1.0/atmelavr-5.1.0.tar.gz", - "hash": "sha256-0XGSJi0KwN04/98qUTlzkmYtm1K95fc4JWJoYIhLQhk=" - }, - "x86_64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/5.1.0/atmelavr-5.1.0.tar.gz", - "hash": "sha256-0XGSJi0KwN04/98qUTlzkmYtm1K95fc4JWJoYIhLQhk=" } } }, - "framework-arduino-avr": { + "packages/framework-arduino-avr": { "name": "framework-arduino-avr", - "install_path": "packages/framework-arduino-avr", - "version": "5.2.0", - "manifest": "{\"type\":\"tool\",\"version\":\"5.2.0\",\"spec\":{\"owner\":\"platformio\",\"name\":\"framework-arduino-avr\",\"id\":8039,\"requirements\":null,\"uri\":null},\"name\":\"framework-arduino-avr\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.2.0/framework-arduino-avr-5.2.0.tar.gz", - "hash": "sha256-caP+gsutiVwQ2oCsd/guUMdxsR26Iabi+dIbxTr0ARY=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.2.0/framework-arduino-avr-5.2.0.tar.gz", - "hash": "sha256-caP+gsutiVwQ2oCsd/guUMdxsR26Iabi+dIbxTr0ARY=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.2.0/framework-arduino-avr-5.2.0.tar.gz", - "hash": "sha256-caP+gsutiVwQ2oCsd/guUMdxsR26Iabi+dIbxTr0ARY=" - }, - "x86_64-darwin": { + "manifest": { + "type": "tool", + "version": "5.2.0", + "spec": { + "owner": "platformio", + "name": "framework-arduino-avr", + "id": 8039, + "requirements": null, + "uri": null + }, + "name": "framework-arduino-avr" + }, + "src": { + "universal": { "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.2.0/framework-arduino-avr-5.2.0.tar.gz", "hash": "sha256-caP+gsutiVwQ2oCsd/guUMdxsR26Iabi+dIbxTr0ARY=" } } }, - "tool-scons": { + "packages/tool-scons": { "name": "tool-scons", - "install_path": "packages/tool-scons", - "version": "4.40700.0", - "manifest": "{\"type\":\"tool\",\"version\":\"4.40700.0\",\"spec\":{\"owner\":\"platformio\",\"name\":\"tool-scons\",\"id\":8192,\"requirements\":null,\"uri\":null},\"name\":\"tool-scons\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", - "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", - "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", - "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" - }, - "x86_64-darwin": { + "manifest": { + "type": "tool", + "version": "4.40700.0", + "spec": { + "owner": "platformio", + "name": "tool-scons", + "id": 8192, + "requirements": null, + "uri": null + }, + "name": "tool-scons" + }, + "src": { + "universal": { "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" } } }, - "toolchain-atmelavr": { + "packages/toolchain-atmelavr": { "name": "toolchain-atmelavr", - "install_path": "packages/toolchain-atmelavr", - "version": "1.70300.191015", - "manifest": "{\"type\":\"tool\",\"version\":\"1.70300.191015\",\"spec\":{\"owner\":\"platformio\",\"name\":\"toolchain-atmelavr\",\"id\":8203,\"requirements\":null,\"uri\":null},\"name\":\"toolchain-atmelavr\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_aarch64-1.70300.191015.tar.gz", - "hash": "sha256-N/UfxyaclS175uiH9lyyYw9yeO5c7LwZ4CAD2JXp0zQ=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", - "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_x86_64-1.70300.191015.tar.gz", - "hash": "sha256-Zk8LewihXo1jYrh+L9taTc/VlZ68WxnZOOff9vEvBSQ=" - }, - "x86_64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", - "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + "manifest": { + "type": "tool", + "version": "1.70300.191015", + "spec": { + "owner": "platformio", + "name": "toolchain-atmelavr", + "id": 8203, + "requirements": null, + "uri": null + }, + "name": "toolchain-atmelavr" + }, + "src": { + "systems": { + "aarch64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_aarch64-1.70300.191015.tar.gz", + "hash": "sha256-N/UfxyaclS175uiH9lyyYw9yeO5c7LwZ4CAD2JXp0zQ=" + }, + "aarch64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + }, + "x86_64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-Zk8LewihXo1jYrh+L9taTc/VlZ68WxnZOOff9vEvBSQ=" + }, + "x86_64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + } + } + } + }, + "platforms/atmelavr": { + "name": "atmelavr", + "manifest": { + "type": "platform", + "version": "5.1.0", + "spec": { + "owner": "platformio", + "name": "atmelavr", + "id": 8006, + "requirements": null, + "uri": null + }, + "name": "atmelavr" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/5.1.0/atmelavr-5.1.0.tar.gz", + "hash": "sha256-0XGSJi0KwN04/98qUTlzkmYtm1K95fc4JWJoYIhLQhk=" } } } diff --git a/examples/marlin/.gitignore b/examples/marlin/.gitignore new file mode 100644 index 0000000..5a18cd2 --- /dev/null +++ b/examples/marlin/.gitignore @@ -0,0 +1 @@ +source diff --git a/examples/marlin/package.nix b/examples/marlin/package.nix index 776abcb..fe23b1c 100644 --- a/examples/marlin/package.nix +++ b/examples/marlin/package.nix @@ -30,10 +30,11 @@ stdenv.mkDerivation { patchPhase = '' patchShebangs ./buildroot/bin + substituteInPlace buildroot/bin/mftest \ + --replace-fail 'pio run $SILENT_FLAG -e $TARGET' 'pio run -v -e $TARGET' ''; buildPhase = '' - echo "PLATFORMIO_CORE_DIR: $PLATFORMIO_CORE_DIR" echo '1' | make marlin ''; diff --git a/examples/marlin/platformio2nix.lock b/examples/marlin/platformio2nix.lock index 1dfe428..161468d 100644 --- a/examples/marlin/platformio2nix.lock +++ b/examples/marlin/platformio2nix.lock @@ -1,99 +1,101 @@ { - "version": "V1", + "version": "2", "dependencies": { - "atmelavr": { - "name": "atmelavr", - "install_path": "platforms/atmelavr", - "version": "4.0.1", - "manifest": "{\"type\":\"platform\",\"version\":\"4.0.1\",\"spec\":{\"owner\":\"platformio\",\"name\":\"atmelavr\",\"id\":8006,\"requirements\":null,\"uri\":null},\"name\":\"atmelavr\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/4.0.1/atmelavr-4.0.1.tar.gz", - "hash": "sha256-8ZQm0jYjZg07sHCDA6tRbeROjBxK+YC+jUlRz9pAADg=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/4.0.1/atmelavr-4.0.1.tar.gz", - "hash": "sha256-8ZQm0jYjZg07sHCDA6tRbeROjBxK+YC+jUlRz9pAADg=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/4.0.1/atmelavr-4.0.1.tar.gz", - "hash": "sha256-8ZQm0jYjZg07sHCDA6tRbeROjBxK+YC+jUlRz9pAADg=" - }, - "x86_64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/4.0.1/atmelavr-4.0.1.tar.gz", - "hash": "sha256-8ZQm0jYjZg07sHCDA6tRbeROjBxK+YC+jUlRz9pAADg=" - } - } - }, - "framework-arduino-avr": { + "packages/framework-arduino-avr": { "name": "framework-arduino-avr", - "install_path": "packages/framework-arduino-avr", - "version": "5.1.0", - "manifest": "{\"type\":\"tool\",\"version\":\"5.1.0\",\"spec\":{\"owner\":\"platformio\",\"name\":\"framework-arduino-avr\",\"id\":8039,\"requirements\":null,\"uri\":null},\"name\":\"framework-arduino-avr\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.1.0/framework-arduino-avr-5.1.0.tar.gz", - "hash": "sha256-xLrMgYk3fa3bs543zVhyb+usdtF/R5o1K/tVXmNXozo=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.1.0/framework-arduino-avr-5.1.0.tar.gz", - "hash": "sha256-xLrMgYk3fa3bs543zVhyb+usdtF/R5o1K/tVXmNXozo=" + "manifest": { + "type": "tool", + "version": "5.1.0", + "spec": { + "owner": "platformio", + "name": "framework-arduino-avr", + "id": 8039, + "requirements": null, + "uri": null }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.1.0/framework-arduino-avr-5.1.0.tar.gz", - "hash": "sha256-xLrMgYk3fa3bs543zVhyb+usdtF/R5o1K/tVXmNXozo=" - }, - "x86_64-darwin": { + "name": "framework-arduino-avr" + }, + "src": { + "universal": { "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.1.0/framework-arduino-avr-5.1.0.tar.gz", "hash": "sha256-xLrMgYk3fa3bs543zVhyb+usdtF/R5o1K/tVXmNXozo=" } } }, - "tool-scons": { + "packages/tool-scons": { "name": "tool-scons", - "install_path": "packages/tool-scons", - "version": "4.40700.0", - "manifest": "{\"type\":\"tool\",\"version\":\"4.40700.0\",\"spec\":{\"owner\":\"platformio\",\"name\":\"tool-scons\",\"id\":8192,\"requirements\":null,\"uri\":null},\"name\":\"tool-scons\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", - "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" + "manifest": { + "type": "tool", + "version": "4.40700.0", + "spec": { + "owner": "platformio", + "name": "tool-scons", + "id": 8192, + "requirements": null, + "uri": null }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", - "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" - }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", - "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" - }, - "x86_64-darwin": { + "name": "tool-scons" + }, + "src": { + "universal": { "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" } } }, - "toolchain-atmelavr": { + "packages/toolchain-atmelavr": { "name": "toolchain-atmelavr", - "install_path": "packages/toolchain-atmelavr", - "version": "1.70300.191015", - "manifest": "{\"type\":\"tool\",\"version\":\"1.70300.191015\",\"spec\":{\"owner\":\"platformio\",\"name\":\"toolchain-atmelavr\",\"id\":8203,\"requirements\":null,\"uri\":null},\"name\":\"toolchain-atmelavr\"}", - "systems": { - "aarch64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_aarch64-1.70300.191015.tar.gz", - "hash": "sha256-N/UfxyaclS175uiH9lyyYw9yeO5c7LwZ4CAD2JXp0zQ=" - }, - "aarch64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", - "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + "manifest": { + "type": "tool", + "version": "1.70300.191015", + "spec": { + "owner": "platformio", + "name": "toolchain-atmelavr", + "id": 8203, + "requirements": null, + "uri": null }, - "x86_64-linux": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_x86_64-1.70300.191015.tar.gz", - "hash": "sha256-Zk8LewihXo1jYrh+L9taTc/VlZ68WxnZOOff9vEvBSQ=" + "name": "toolchain-atmelavr" + }, + "src": { + "systems": { + "aarch64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_aarch64-1.70300.191015.tar.gz", + "hash": "sha256-N/UfxyaclS175uiH9lyyYw9yeO5c7LwZ4CAD2JXp0zQ=" + }, + "aarch64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + }, + "x86_64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-Zk8LewihXo1jYrh+L9taTc/VlZ68WxnZOOff9vEvBSQ=" + }, + "x86_64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + } + } + } + }, + "platforms/atmelavr": { + "name": "atmelavr", + "manifest": { + "type": "platform", + "version": "4.0.1", + "spec": { + "owner": "platformio", + "name": "atmelavr", + "id": 8006, + "requirements": null, + "uri": null }, - "x86_64-darwin": { - "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", - "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + "name": "atmelavr" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/4.0.1/atmelavr-4.0.1.tar.gz", + "hash": "sha256-8ZQm0jYjZg07sHCDA6tRbeROjBxK+YC+jUlRz9pAADg=" } } } diff --git a/examples/multi-env/flake.nix b/examples/multi-env/flake.nix new file mode 100644 index 0000000..a735782 --- /dev/null +++ b/examples/multi-env/flake.nix @@ -0,0 +1,37 @@ +{ + description = "PlatformIO external dependency (URL) example"; + + inputs = { + platformio2nix.url = "../.."; + # nixpkgs.follows = "platformio2nix.inputs.nixpkgs"; + }; + + outputs = + { platformio2nix, ... }: + let + nixpkgs = platformio2nix.inputs.nixpkgs; + inherit (nixpkgs) lib; + forAllSystems = lib.genAttrs [ + "aarch64-darwin" + "aarch64-linux" + "x86_64-darwin" + "x86_64-linux" + ]; + in + rec { + packages = forAllSystems ( + system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ platformio2nix.overlays.default ]; + }; + in + { + default = pkgs.callPackage ./package.nix { }; + } + ); + + checks = packages; + }; +} diff --git a/examples/multi-env/package.nix b/examples/multi-env/package.nix new file mode 100644 index 0000000..379d5c8 --- /dev/null +++ b/examples/multi-env/package.nix @@ -0,0 +1,40 @@ +{ + gnumake, + makePlatformIOSetupHook, + platformio, + stdenv, + which, + ... +}: +let + version = "0.0.0"; + src = ./.; + setupHook = makePlatformIOSetupHook { + lockfile = ./platformio2nix.lock; + }; +in +stdenv.mkDerivation { + name = "uno"; + inherit version src; + + nativeBuildInputs = [ setupHook ]; + + buildInputs = [ + gnumake + platformio + which + ]; + + buildPhase = '' + platformio run + ''; + + installPhase = '' + mkdir -p $out + cp -r .pio/build/* $out + ''; + + passthru = { + inherit setupHook; + }; +} diff --git a/examples/multi-env/platformio.ini b/examples/multi-env/platformio.ini new file mode 100644 index 0000000..acb9e1a --- /dev/null +++ b/examples/multi-env/platformio.ini @@ -0,0 +1,29 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:uno] +platform = atmelavr +board = uno +framework = arduino +lib_deps = jgromes/RadioLib@^7.1.2 + +; [env:pico] +; platform = raspberrypi +; board = pico +; board_build.mcu = rp2040 +; framework = arduino +; lib_deps = jgromes/RadioLib@^7.1.2 + +[env:teensy] +platform = teensy +framework = arduino +board = teensy36 +build_flags = -D TEENSY_OPT_SMALLEST_CODE +lib_deps = jgromes/RadioLib@^7.1.2 diff --git a/examples/multi-env/platformio2nix.lock b/examples/multi-env/platformio2nix.lock new file mode 100644 index 0000000..b44b4e0 --- /dev/null +++ b/examples/multi-env/platformio2nix.lock @@ -0,0 +1,351 @@ +{ + "version": "2", + "dependencies": { + "libdeps/pico/RadioLib": { + "name": "RadioLib", + "manifest": { + "type": "library", + "version": "7.1.2", + "spec": { + "owner": "jgromes", + "name": "RadioLib", + "id": 5795, + "requirements": null, + "uri": null + }, + "name": "RadioLib" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/jgromes/library/RadioLib/7.1.2/RadioLib-7.1.2.tar.gz", + "hash": "sha256-wWaoYmkosUs06KUldjKEi9+NplEP8W6b3f0P8HDEpBk=" + } + } + }, + "libdeps/teensy/RadioLib": { + "name": "RadioLib", + "manifest": { + "type": "library", + "version": "7.1.2", + "spec": { + "owner": "jgromes", + "name": "RadioLib", + "id": 5795, + "requirements": null, + "uri": null + }, + "name": "RadioLib" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/jgromes/library/RadioLib/7.1.2/RadioLib-7.1.2.tar.gz", + "hash": "sha256-wWaoYmkosUs06KUldjKEi9+NplEP8W6b3f0P8HDEpBk=" + } + } + }, + "libdeps/uno/RadioLib": { + "name": "RadioLib", + "manifest": { + "type": "library", + "version": "7.1.2", + "spec": { + "owner": "jgromes", + "name": "RadioLib", + "id": 5795, + "requirements": null, + "uri": null + }, + "name": "RadioLib" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/jgromes/library/RadioLib/7.1.2/RadioLib-7.1.2.tar.gz", + "hash": "sha256-wWaoYmkosUs06KUldjKEi9+NplEP8W6b3f0P8HDEpBk=" + } + } + }, + "packages/framework-arduino-avr": { + "name": "framework-arduino-avr", + "manifest": { + "type": "tool", + "version": "5.2.0", + "spec": { + "owner": "platformio", + "name": "framework-arduino-avr", + "id": 8039, + "requirements": null, + "uri": null + }, + "name": "framework-arduino-avr" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-avr/5.2.0/framework-arduino-avr-5.2.0.tar.gz", + "hash": "sha256-caP+gsutiVwQ2oCsd/guUMdxsR26Iabi+dIbxTr0ARY=" + } + } + }, + "packages/framework-arduino-mbed": { + "name": "framework-arduino-mbed", + "manifest": { + "type": "tool", + "version": "4.2.1", + "spec": { + "owner": "platformio", + "name": "framework-arduino-mbed", + "id": 11972, + "requirements": null, + "uri": null + }, + "name": "framework-arduino-mbed" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduino-mbed/4.2.1/framework-arduino-mbed-4.2.1.tar.gz", + "hash": "sha256-rPjD9y0+tGJPVM8jQCexql/yw5JE3XYorVFcfQGsPLc=" + } + } + }, + "packages/framework-arduinoteensy": { + "name": "framework-arduinoteensy", + "manifest": { + "type": "tool", + "version": "1.159.0", + "spec": { + "owner": "platformio", + "name": "framework-arduinoteensy", + "id": 8084, + "requirements": null, + "uri": null + }, + "name": "framework-arduinoteensy" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/framework-arduinoteensy/1.159.0/framework-arduinoteensy-1.159.0.tar.gz", + "hash": "sha256-xRH6BHRxxla8KM/l6V6ssiP4PMejsx/PZS4ltec/eDg=" + } + } + }, + "packages/tool-rp2040tools": { + "name": "tool-rp2040tools", + "manifest": { + "type": "tool", + "version": "1.0.2", + "spec": { + "owner": "platformio", + "name": "tool-rp2040tools", + "id": 12086, + "requirements": null, + "uri": null + }, + "name": "tool-rp2040tools" + }, + "src": { + "systems": { + "aarch64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-rp2040tools/1.0.2/tool-rp2040tools-linux_aarch64-1.0.2.tar.gz", + "hash": "sha256-jhVtaJi51mdB0FzIL9eQQK0S60s4FajF7wUOAioO5+E=" + }, + "aarch64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-rp2040tools/1.0.2/tool-rp2040tools-darwin_x86_64-1.0.2.tar.gz", + "hash": "sha256-iK6R8Bp4f8nYGJJIXSWO9iBQ70SvlLT4L8B/qp47SI8=" + }, + "x86_64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-rp2040tools/1.0.2/tool-rp2040tools-linux_x86_64-1.0.2.tar.gz", + "hash": "sha256-SyRtKZYzWWud2/PzwejIFeDtoApKECFghi1GmZH5gPs=" + }, + "x86_64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-rp2040tools/1.0.2/tool-rp2040tools-darwin_x86_64-1.0.2.tar.gz", + "hash": "sha256-iK6R8Bp4f8nYGJJIXSWO9iBQ70SvlLT4L8B/qp47SI8=" + } + } + } + }, + "packages/tool-scons": { + "name": "tool-scons", + "manifest": { + "type": "tool", + "version": "4.40700.0", + "spec": { + "owner": "platformio", + "name": "tool-scons", + "id": 8192, + "requirements": null, + "uri": null + }, + "name": "tool-scons" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/tool-scons/4.40700.0/tool-scons-4.40700.0.tar.gz", + "hash": "sha256-AtWAJ9UsR99TNBJ6rb6YZvp+Ega/IZIGb4mx/qIP2VM=" + } + } + }, + "packages/toolchain-atmelavr": { + "name": "toolchain-atmelavr", + "manifest": { + "type": "tool", + "version": "1.70300.191015", + "spec": { + "owner": "platformio", + "name": "toolchain-atmelavr", + "id": 8203, + "requirements": null, + "uri": null + }, + "name": "toolchain-atmelavr" + }, + "src": { + "systems": { + "aarch64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_aarch64-1.70300.191015.tar.gz", + "hash": "sha256-N/UfxyaclS175uiH9lyyYw9yeO5c7LwZ4CAD2JXp0zQ=" + }, + "aarch64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + }, + "x86_64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-linux_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-Zk8LewihXo1jYrh+L9taTc/VlZ68WxnZOOff9vEvBSQ=" + }, + "x86_64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-atmelavr/1.70300.191015/toolchain-atmelavr-darwin_x86_64-1.70300.191015.tar.gz", + "hash": "sha256-ZbvIZjFjRU9nj5WSqnRdLvfjvphlS1kIMAmvVmSKBvI=" + } + } + } + }, + "packages/toolchain-gccarmnoneeabi": { + "name": "toolchain-gccarmnoneeabi", + "manifest": { + "type": "tool", + "version": "1.90201.191206", + "spec": { + "owner": "platformio", + "name": "toolchain-gccarmnoneeabi", + "id": 8207, + "requirements": null, + "uri": null + }, + "name": "toolchain-gccarmnoneeabi" + }, + "src": { + "systems": { + "aarch64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi/1.90201.191206/toolchain-gccarmnoneeabi-darwin_x86_64-1.90201.191206.tar.gz", + "hash": "sha256-MJ+3zVwbEvG6japvdVTMlclqgSRrb/SDPLsxQ2+Pat0=" + }, + "x86_64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi/1.90201.191206/toolchain-gccarmnoneeabi-linux_x86_64-1.90201.191206.tar.gz", + "hash": "sha256-FA+yY3mLncGVCzgxxE2asBGW+IMBK3hlix4AK5A10mw=" + }, + "x86_64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi/1.90201.191206/toolchain-gccarmnoneeabi-darwin_x86_64-1.90201.191206.tar.gz", + "hash": "sha256-MJ+3zVwbEvG6japvdVTMlclqgSRrb/SDPLsxQ2+Pat0=" + } + } + } + }, + "packages/toolchain-gccarmnoneeabi-teensy": { + "name": "toolchain-gccarmnoneeabi-teensy", + "manifest": { + "type": "tool", + "version": "1.110301.0", + "spec": { + "owner": "platformio", + "name": "toolchain-gccarmnoneeabi-teensy", + "id": 15316, + "requirements": null, + "uri": null + }, + "name": "toolchain-gccarmnoneeabi-teensy" + }, + "src": { + "systems": { + "aarch64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi-teensy/1.110301.0/toolchain-gccarmnoneeabi-teensy-linux_aarch64-1.110301.0.tar.gz", + "hash": "sha256-jGJtTPMhuFx/YCx2ppAVHqxlC7OxvZxHQkvMR3W9QSY=" + }, + "aarch64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi-teensy/1.110301.0/toolchain-gccarmnoneeabi-teensy-darwin_x86_64-1.110301.0.tar.gz", + "hash": "sha256-j4iIDqCiOwHFuq4+PDQ7lKhM6lG86Vf0tVGDRijm8t4=" + }, + "x86_64-linux": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi-teensy/1.110301.0/toolchain-gccarmnoneeabi-teensy-linux_x86_64-1.110301.0.tar.gz", + "hash": "sha256-lYiRxsxohivQeveRQpEXNyHRxaD8u7mwXo4XVk3WUqo=" + }, + "x86_64-darwin": { + "url": "https://dl.registry.platformio.org/download/platformio/tool/toolchain-gccarmnoneeabi-teensy/1.110301.0/toolchain-gccarmnoneeabi-teensy-darwin_x86_64-1.110301.0.tar.gz", + "hash": "sha256-j4iIDqCiOwHFuq4+PDQ7lKhM6lG86Vf0tVGDRijm8t4=" + } + } + } + }, + "platforms/atmelavr": { + "name": "atmelavr", + "manifest": { + "type": "platform", + "version": "5.1.0", + "spec": { + "owner": "platformio", + "name": "atmelavr", + "id": 8006, + "requirements": null, + "uri": null + }, + "name": "atmelavr" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/platform/atmelavr/5.1.0/atmelavr-5.1.0.tar.gz", + "hash": "sha256-0XGSJi0KwN04/98qUTlzkmYtm1K95fc4JWJoYIhLQhk=" + } + } + }, + "platforms/raspberrypi": { + "name": "raspberrypi", + "manifest": { + "type": "platform", + "version": "1.15.0", + "spec": { + "owner": "platformio", + "name": "raspberrypi", + "id": 12119, + "requirements": null, + "uri": null + }, + "name": "raspberrypi" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/platform/raspberrypi/1.15.0/raspberrypi-1.15.0.tar.gz", + "hash": "sha256-EbfZzXARKUajVTiSoBAPRkS+dQ26tqDMzG8IIPfB7mg=" + } + } + }, + "platforms/teensy": { + "name": "teensy", + "manifest": { + "type": "platform", + "version": "5.0.0", + "spec": { + "owner": "platformio", + "name": "teensy", + "id": 8021, + "requirements": null, + "uri": null + }, + "name": "teensy" + }, + "src": { + "universal": { + "url": "https://dl.registry.platformio.org/download/platformio/platform/teensy/5.0.0/teensy-5.0.0.tar.gz", + "hash": "sha256-6m5cVtlmi77fJK84q6yq/losi4o0794ylrndx8SrWrY=" + } + } + } + } +} diff --git a/examples/multi-env/src/main.cpp b/examples/multi-env/src/main.cpp new file mode 100644 index 0000000..221a8c5 --- /dev/null +++ b/examples/multi-env/src/main.cpp @@ -0,0 +1,6 @@ +#include "Arduino.h" +#include + +void setup() {} + +void loop() {} diff --git a/setup-hook.nix b/setup-hook.nix index 214b808..8326f0b 100644 --- a/setup-hook.nix +++ b/setup-hook.nix @@ -1,11 +1,12 @@ { - fetchurl, lib, + fetchurl, linkFarm, makeSetupHook, runCommand, stdenv, writeShellScript, + writeShellScriptBin, writeTextFile, }: @@ -15,19 +16,20 @@ }: let + inherit (builtins.fromJSON (builtins.readFile lockfile)) version dependencies; initialDeps = builtins.mapAttrs ( - _: dep: + installPath: dep: let - throwSystem = throw "${dep.name} unsupported system: ${stdenv.system}"; - src = dep.systems.${stdenv.system} or throwSystem; + throwSystem = throw "${dep.name} unsupported system: ${stdenv.system}: ${builtins.attrNames dep.src}"; + src = dep.src.universal or dep.src.systems.${stdenv.system} or throwSystem; in stdenv.mkDerivation { pname = dep.name; - version = dep.version; + version = dep.manifest.version; src = fetchurl src; sourceRoot = "."; - env.MANIFEST = dep.manifest; + env.MANIFEST = builtins.toJSON dep.manifest; buildPhase = '' runHook preBuild mkdir -p "$out" @@ -38,55 +40,64 @@ let passthru = { inherit (dep) manifest; - installPath = dep.install_path; + inherit installPath; mutableInstall = false; }; } - ) (builtins.fromJSON (builtins.readFile lockfile)).dependencies; + ) dependencies; finalDeps = initialDeps // (overrides finalDeps initialDeps); -in -makeSetupHook - { - name = "platformio-setup-hook"; - passthru = { - inherit finalDeps; - }; - } - ( - let - # derived from `linkFarm` - linkCommands = lib.mapAttrsToList ( - _: drv: + self = + makeSetupHook + { + name = "platformio-setup-hook"; + passthru = { + inherit finalDeps; + run = writeShellScriptBin "run" '' + source ${self}/nix-support/setup-hook + _platformioSetupHook + ''; + }; + } + ( let - dest = "$PLATFORMIO_CORE_DIR/${drv.passthru.installPath}"; + # derived from `linkFarm` + linkCommands = lib.mapAttrsToList ( + _: drv: + let + dest = "$PLATFORMIO_CORE_DIR/${drv.passthru.installPath}"; + in + '' + mkdir -p "$(dirname "${dest}")" + ${ + if drv.passthru.mutableInstall then + '' + cp -Lr "${drv}" "${dest}" + chmod -R +w "${dest}" + '' + else + ''ln -s "${drv}" "${dest}"'' + } + '' + ) finalDeps; in - '' - mkdir -p "$(dirname "${dest}")" - ${ - if drv.passthru.mutableInstall then - '' - cp -Lr "${drv}" "${dest}" - chmod -R +w "${dest}" - '' - else - ''ln -s "${drv}" "${dest}"'' + writeShellScript "platformio-setup-hook.sh" '' + _platformioSetupHook() { + export PLATFORMIO_CORE_DIR=./.pio + export PLATFORMIO_WORKSPACE_DIR=./.pio + # top-level directory must be writable by PlatformIO + mkdir -p $PLATFORMIO_CORE_DIR + ${lib.concatStrings linkCommands} } + preConfigureHooks+=(_platformioSetupHook) '' - ) finalDeps; - in - writeShellScript "platformio-setup-hook.sh" '' - _platformioSetupHook() { - export PLATFORMIO_CORE_DIR=./.pio - export PLATFORMIO_WORKSPACE_DIR=./.pio - # top-level directory must be writable by PlatformIO - mkdir -p $PLATFORMIO_CORE_DIR - ${lib.concatStrings linkCommands} - } - preConfigureHooks+=(_platformioSetupHook) - '' - // { - passthru = { - inherit finalDeps; - }; - } - ) + // { + passthru = { + inherit finalDeps; + }; + } + ); +in + +assert lib.assertMsg (version == "2") ''Unsupported lockfile version "${version}"''; + +self From 81c9c69c72b6f92f556d7e288ff36b46eb71f9d2 Mon Sep 17 00:00:00 2001 From: Nathan Regner Date: Sun, 2 Feb 2025 11:14:53 -0700 Subject: [PATCH 4/4] feat: support symlinks in core_dir --- cli/src/manifest.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/cli/src/manifest.rs b/cli/src/manifest.rs index 21af373..082a5df 100644 --- a/cli/src/manifest.rs +++ b/cli/src/manifest.rs @@ -1,5 +1,6 @@ use std::{ collections::BTreeMap, + fs, path::{Path, PathBuf}, }; @@ -70,25 +71,28 @@ pub struct ExternalSpec { pub fn extract_artifacts(root: &Path) -> eyre::Result> { let mut artifacts = vec![]; - extract_artifacts_rec(&mut artifacts, root, root)?; + extract_artifacts_rec(&mut artifacts, &PathBuf::default(), root)?; Ok(artifacts) } fn extract_artifacts_rec( artifacts: &mut Vec, - root: &Path, + parent: &Path, dir: &Path, ) -> eyre::Result<()> { for entry in std::fs::read_dir(dir).with_context(|| format!("reading {dir:?}"))? { let entry = entry?; - if !entry.file_type()?.is_dir() { + + let path = fs::canonicalize(entry.path())?; + if !path.is_dir() { continue; } - let path = entry.path(); + + let parent = parent.join(entry.file_name()); let piopm = path.join(".piopm"); if !piopm.exists() { - extract_artifacts_rec(artifacts, root, &path)?; + extract_artifacts_rec(artifacts, &parent, &path)?; continue; } @@ -98,15 +102,9 @@ fn extract_artifacts_rec( serde_path_to_error::deserialize::<_, PackageManifest>(de).wrap_err_with(|| { format!("failed to parse manifest file: {}", piopm.to_string_lossy()) })?; - let install_path = path - .strip_prefix(root) - .wrap_err_with(|| { - format!("File {dir:?} is not a child of {root:?}: followed a symlink?") - })? - .to_path_buf(); artifacts.push(Artifact { manifest, - install_path, + install_path: parent, }); }