From ff39127ae521cf6a0a570eee42e3e082d33c8dc6 Mon Sep 17 00:00:00 2001 From: Connor Horman Date: Thu, 31 Aug 2023 20:25:28 -0400 Subject: [PATCH] feat: Start lccc-autobuild --- .cargo/config.toml | 8 +- Cargo.lock | 114 ++++++++++++++++++++++- Cargo.toml | 1 + autobuild.toml | 40 +++++++-- autobuild/Cargo.lock | 154 ++++++++++++++++++++++++++++++++ autobuild/Cargo.toml | 14 +++ autobuild/src/config.rs | 128 ++++++++++++++++++++++++++ autobuild/src/dep.rs | 100 +++++++++++++++++++++ autobuild/src/main.rs | 7 ++ autobuild/src/programs.rs | 1 + autobuild/src/programs/rustc.rs | 24 +++++ 11 files changed, 581 insertions(+), 10 deletions(-) create mode 100644 autobuild/Cargo.lock create mode 100644 autobuild/Cargo.toml create mode 100644 autobuild/src/config.rs create mode 100644 autobuild/src/dep.rs create mode 100644 autobuild/src/main.rs create mode 100644 autobuild/src/programs.rs create mode 100644 autobuild/src/programs/rustc.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index 86a6cae5..4bdb0f85 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,3 +1,9 @@ [alias] +autobuild = ["run", "--package","autobuild","--release","--"] +configure = "autobuild configure" +build-lccc = "autobuild build" run-lccc = "run --bin lccc -- --intree" -run-lccc-release = "run --release --bin lccc -- --intree" \ No newline at end of file +run-lccc-release = "run --release --bin lccc -- --intree" + +[env] +AUTOBUILD_DIR={relative=true, value="autobuild"} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 5486a35c..b38afba3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,18 @@ dependencies = [ "target-tuples", ] +[[package]] +name = "autobuild" +version = "0.1.0" +dependencies = [ + "install-dirs 0.3.1", + "itertools", + "serde", + "serde_derive", + "target-tuples", + "toml 0.7.6", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -139,6 +151,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "fake-enum" version = "0.1.4" @@ -199,6 +217,22 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "install-dirs" version = "0.2.1" @@ -208,10 +242,28 @@ dependencies = [ "serde", ] +[[package]] +name = "install-dirs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbf71970b5e249fb464339b5a835d35c03bac97a8fb99e8863d444297fa8bb9" +dependencies = [ + "serde", +] + [[package]] name = "interning-static-syms" version = "0.1.0" +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -222,12 +274,12 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" name = "lccc" version = "0.1.0" dependencies = [ - "install-dirs", + "install-dirs 0.2.1", "serde", "serde_derive", "target-tuples", "temp-file", - "toml", + "toml 0.5.11", "which", "xlang", "xlang_host", @@ -257,6 +309,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "memchr" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" + [[package]] name = "once_cell" version = "1.18.0" @@ -396,6 +454,15 @@ dependencies = [ "syn 2.0.27", ] +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + [[package]] name = "smallvec" version = "1.11.0" @@ -451,6 +518,40 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "transparent" version = "0.1.0" @@ -544,6 +645,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] + [[package]] name = "xlang" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index f4465bbf..18e671b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "autobuild", "xlang", "xlang/xlang_abi", "xlang/xlang_abi_macro", "xlang/xlang_struct", "xlang/xlang_targets", diff --git a/autobuild.toml b/autobuild.toml index f061955e..8820142f 100644 --- a/autobuild.toml +++ b/autobuild.toml @@ -1,13 +1,39 @@ +[package] +name = "lccc" +version = "0.1" + [dirs] -lcccdir = "$libdir/lccc" -xlangdir = "$lcccdir/xlang" -sysrootdir = "$lcccdir/sysroot" +lcccdir = "{libdir}/lccc" +xlangdir = "{lcccdir}/xlang" +sysrootdir = "{lcccdir}/sysroot" +libsrcdir = "{lcccdir}/libsrc" [programs.RUSTC] -type = "rustc" -target = "$host" +type="rustc" +target="{host}" [programs.RUSTC_FOR_BUILD] -type = "rustc" -target = "$build" +type="rustc" +target="{build}" + + +[target.groups.frontends] +members=["rust","c"] + +[target.groups.backends] +path-specifier="codegen-{}" +members=["clever","x86","w65"] + +[target.xlang] +subdir="xlang" + +[target.lccc] +subdir="lccc" + + +[stages.host] +build=["xlang","frontends","backends","lccc"] + +[stages] +order=["host"] \ No newline at end of file diff --git a/autobuild/Cargo.lock b/autobuild/Cargo.lock new file mode 100644 index 00000000..046be4b9 --- /dev/null +++ b/autobuild/Cargo.lock @@ -0,0 +1,154 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autobuild" +version = "0.1.0" +dependencies = [ + "install-dirs", + "serde", + "serde_derive", + "toml", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "install-dirs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbf71970b5e249fb464339b5a835d35c03bac97a8fb99e8863d444297fa8bb9" + +[[package]] +name = "memchr" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + +[[package]] +name = "syn" +version = "2.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] diff --git a/autobuild/Cargo.toml b/autobuild/Cargo.toml new file mode 100644 index 00000000..5289adb2 --- /dev/null +++ b/autobuild/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "autobuild" +version = "0.1.0" +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = "1" +serde_derive = "1" +toml = "0.7.6" +install-dirs= {version="0.3.1", features=["serde"]} +target-tuples = "0.5.12" +itertools = "0.11.0" \ No newline at end of file diff --git a/autobuild/src/config.rs b/autobuild/src/config.rs new file mode 100644 index 00000000..6e9b11a6 --- /dev/null +++ b/autobuild/src/config.rs @@ -0,0 +1,128 @@ +use std::{collections::HashMap, convert::TryFrom, ffi::OsString, path::PathBuf, str::FromStr}; + +use install_dirs::dirs::InstallDirs; +use serde_derive::{Deserialize, Serialize}; + +use target_tuples::{Target, UnknownError}; + +use crate::dep::FileHash; +use crate::programs::rustc::RustcVersion; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ConfigInstallDirs { + #[serde(flatten)] + pub install_dirs: InstallDirs, + #[serde(flatten)] + pub rest: HashMap, +} + +mod serde_target { + use serde::{ + de::{self, Expected}, + Deserialize, Deserializer, Serializer, + }; + use target_tuples::Target; + + pub fn serialize(targ: &Target, ser: S) -> Result + where + S: Serializer, + { + ser.serialize_str(targ.get_name()) + } + + pub fn deserialize<'de, D>(de: D) -> Result + where + D: Deserializer<'de>, + { + struct ExpectedTarget; + + impl de::Expected for ExpectedTarget { + fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("Expected a target in the form - or -- with sys being one of , , or followed by either or ") + } + } + let ty = <&str>::deserialize(de)?; + + ty.parse().map_err(|e| { + ::invalid_value(de::Unexpected::Str(ty), &ExpectedTarget) + }) + } +} + +#[derive(Clone, Debug, Hash, PartialEq, Eq, Deserialize, Serialize)] +pub struct ConfigTargets { + #[serde(with = "serde_target")] + pub build: Target, + #[serde(with = "serde_target")] + pub host: Target, + #[serde(with = "serde_target")] + pub target: Target, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ConfigFoundProgram { + pub location: PathBuf, + #[serde(flatten)] + pub info: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub enum ConfigProgramInfo { + Rustc(RustcVersion), +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ConfigData { + pub source_manifest: PathBuf, + pub bin_dir: PathBuf, + pub dirs: ConfigInstallDirs, + pub env: HashMap, + pub programs: HashMap, + pub targets: ConfigTargets, + pub dep_files: HashMap, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ExtraConfigDirs { + #[serde(flatten)] + pub dirs: HashMap, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(untagged)] +pub enum ConfigDirSpec { + Plain(String), + Separator(Vec), +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default)] +#[serde(default)] +pub struct ProgramSpec { + #[serde(rename = "type")] + pub ty: Option, + pub names: Vec, + pub target: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub enum ProgramType {} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct BuildTargets { + pub groups: HashMap, + #[serde(flatten)] + pub targets: HashMap, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct GroupSpec {} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct TargetSpec {} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Manifest { + pub dirs: ExtraConfigDirs, + pub programs: HashMap, + pub target: BuildTargets, +} diff --git a/autobuild/src/dep.rs b/autobuild/src/dep.rs new file mode 100644 index 00000000..dc4a16cb --- /dev/null +++ b/autobuild/src/dep.rs @@ -0,0 +1,100 @@ +use core::convert::TryFrom; +use std::fs::File; + +use serde::{Deserialize, Serialize}; + +use itertools::Itertools as _; + +#[derive(Clone, Debug, Hash, PartialEq, Eq)] +pub struct FileHash([u8; 32]); + +const ALPHA: [u8; 16] = [ + b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'a', b'b', b'c', b'd', b'e', b'f', +]; + +impl Serialize for FileHash { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let mut string = Vec::::with_capacity(64); + + for b in self.0.iter().rev() { + string.push(ALPHA[(b >> 4) as usize]); + string.push(ALPHA[(b & 0xf) as usize]); + } + + // SAFETY: The Vec is entirely ASCII + let string = unsafe { String::from_utf8_unchecked(string) }; + + serializer.serialize_str(&string) + } +} + +impl<'de> Deserialize<'de> for FileHash { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + pub struct HexStringVisitor; + impl<'de> serde::de::Visitor<'de> for HexStringVisitor { + type Value = [u8; 32]; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a 32-byte value as a hex string") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + if v.len() != 64 { + return Err(E::invalid_value(serde::de::Unexpected::Str(v), &self)); + } + let mut bytes = [0u8; 32]; + let mut arrays = v + .as_bytes() + .chunks_exact(2) + .map(|octet| { + let hi = octet[0]; + let lo = octet[1]; + + match (hi, lo) { + ( + hi @ (b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f'), + lo @ (b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f'), + ) => { + let mut mask = (hi << 5) & 0xF0 | (lo << 1) & 0xF; + + mask |= mask >> 1; + mask |= mask >> 2; + + let val = (hi << 4) & 0xF0 | lo & 0x0F; + + let val = val + (0xAA & mask); + + Ok(val) + } + _ => Err(E::invalid_value(serde::de::Unexpected::Str(v), &self)), + } + }) + .zip(bytes.iter_mut().rev()) + .map(|(b, r)| Ok(*r = b?)) + .collect::>()?; + + Ok(bytes) + } + + fn visit_string(self, v: String) -> Result + where + E: serde::de::Error, + { + self.visit_str(&v) + } + } + + let bytes = deserializer.deserialize_str(HexStringVisitor)?; + + Ok(FileHash(bytes)) + } +} diff --git a/autobuild/src/main.rs b/autobuild/src/main.rs new file mode 100644 index 00000000..cb7e12dc --- /dev/null +++ b/autobuild/src/main.rs @@ -0,0 +1,7 @@ +mod config; +mod dep; +mod programs; + +fn main() { + println!("Hello, world!"); +} diff --git a/autobuild/src/programs.rs b/autobuild/src/programs.rs new file mode 100644 index 00000000..3d8b2d42 --- /dev/null +++ b/autobuild/src/programs.rs @@ -0,0 +1 @@ +pub mod rustc; diff --git a/autobuild/src/programs/rustc.rs b/autobuild/src/programs/rustc.rs new file mode 100644 index 00000000..f4377481 --- /dev/null +++ b/autobuild/src/programs/rustc.rs @@ -0,0 +1,24 @@ +use std::collections::HashSet; + +use serde_derive::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct RustcVersion { + pub supported_editions: HashSet, + pub features_available: HashSet, +} + +#[derive(Clone, Debug, Hash, PartialEq, Eq, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum RustEdition { + Rust2015, + Rust2018, + Rust2021, + Rust2024, +} + +#[derive(Clone, Debug, Hash, PartialEq, Eq, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum RustcFeature { + AllowNightly, +}