Introduction
Edifice is a package manager and build automation tool adapted to the hardware industry. Edifice has ambition to be an language-agnostique and rust-powered package manager and automation tool. Its goal is to bring a scalable solution (1000+ IP management) to the hardware industry. Edifice is born to answer to scalability limations of the open source projects Fusesoc and Edalize.
Contributing
License
Limitations of Fusesoc
Python project Fusesoc is not able to efficiently load thousants modules from a registry:
- Python is very slow
- Fusesoc resolve the dependency three for each command
- The fileset is not flexible enough
- Compilation options are common to the whole dependency three
- Module API and backend tools are not versionned as module
- Flags has an impact on module dependencies
- Build are not lockable which prevent reproducibility
Limitations of Edalize
- Python is very slow
- Backend API is common to all tools
- Filesets three is flatenized before being send to backend tool
Configuration files
Module
A module is defined by a file module.toml in a versionned directory.
# module.toml
module_api = "0.1.0"
[module]
name = "module_a"
version = "0.1.0"
[dependencies]
rule_eda = "^1.2.3"
module_b = ">0.2.4"
module_c = "^0.6.1"
module_d = "~1.7.3"
module_e = "2.3.*"
The module version has to respect the semver version syntaxe and the version constraints have to respect the semver containts syntaxe.
Dataset
The transitive data management is done through the file dataset.toml of each module in the tree.
# dataset.toml of module_b
[eda.dataset.dataset_a]
sources = [
"file_e",
"file_f",
]
include_directories = []
compilation_options = [
"+opt_c",
]
prepend = []
# dataset.toml of module_a
[eda.dataset.dataset_a]
sources = [
"file_a",
"file_b",
]
include_directories = [
"include/",
]
compilation_options = [
"+opt_a",
]
prepend = [
"module_c.dataset_a",
]
[eda.dataset.dataset_b]
sources = [
"file_c",
"file_d",
]
include_directories = [
"include/",
]
compilation_options = [
"+opt_a",
]
prepend = [
"module_b.dataset_a",
"dataset_a",
]
Target
- TODO
Dependencies management
Fetch registry
Add dependencies to module
Check module satisfability
Update dependencies version into lock file
Install modules localy
Build generation
Langage agnostique
Remotly cachable artifact
Edifice containes many tools and features:
- A package manager (like Fusesoc, npm, composert ... etc)
- A build automation tool (like Edalize, CMake ... etc)
- Three configurations concept and files:
- The module (module.toml): The name, the version and the dependencies of the package
- The dataset (dataset.toml): The management of the transitives data along the dependencies tree
- The targets (target.toml): The rules to produce the build
Inspirations
The main inspirations of Edifice are:
- Bazel (website, github)
- Versionned rules
- Flexibility of the flow
- Npm (website, github)
- Commands
- Usage
- Semver
- Orbit (website, github)
- Usage of Rust language
- Commands
- Cargo (website, github)
- Commands
- DFS algorithm
- Fusesoc (website, github)
- Semver
- DAG (Directed Acyclic Graph)
- Generators
- Edalize (website, github)
- Tools
- Modular backend