# Easystack notes
```yaml
robot: True
software:
GROMACS:
parallel: 6
toolchains:
foss-2020a:
versions:
2020.1:
2020.3:
from_pr: 1234
include_easyblocks_from_pr: 123
debug: True
trace: True
```
EasyBuild 4.5.0:
```python=
res = (['GROMACS-foss-2020a-2020.1.eb', 'GROMACS-foss-2020a-2020.3.eb'], {})
```
Target:
```python=
orig_paths = [...]
opts_per_ec = {
'GROMACS-foss-2020a-2020.1': {
'parallel': 6,
'robot': True,
},
'GROMACS-foss-2020a-2020.3': {
'debug': True,
'trace': True,
'from_pr': 1234,
'include_easyblocks_from_pr': 123,
'parallel': 6,
'robot': True,
},
}
```
```python=
orig_paths, opts_per_ec = parse_easystack
det_ec_copy_specs(orig_paths, from_pr_list, opts_per_ec={})
det_easyconfig_paths(categorized_paths['easyconfigs'], opts_per_ec={})
```
```python=
opts_per_ec.get(key, {})
```
Actions
* `det_copy_ec_specs`: only relevant for `--copy-ec` => open issue
* `categorize_files_by_type`: no need to be aware of options => no-op
* `det_easyconfig_paths`:
* has to be made aware of `opts_per_ec` for `from-pr` per ec
* How to handle conflicting command line args & EasyStack options? => don't solve now, make ticket. For now, implement so that EasyStack always wins.
* per-ec options need to be installed:
* [ESSENTIAL] Add feature to `update_build_option(key, value)` function to return the original key/value (so that we can restore later).
* [ESSENTIAL] also implement `update_build_options(dict)` utility function to pass `opts_by_ec[ec_filename]` dict + return original values (in a dict, aggregated from the returns of `update_build_option`)
* [ESSENTIAL] when parsing easyconfigs (see `parse_easyconfigs` in `framework/easyconfig/tools.py`)
* Add update of build options at https://github.com/easybuilders/easybuild-framework/blob/f1f421b7b126d95afd6fc97d7a650e5fc3b38bfb/easybuild/framework/easyconfig/tools.py#L387
* Do the parse + store custom options in `EasyConfig` instance (`self.custom_build_opts`)
* Restore original build options with another call to `update_build_options`
* [DETAIL] when resolving dependencies (in `resolve_dependencies`, right before `robot_find_easyconfig` is called in while loop, https://github.com/easybuilders/easybuild-framework/blob/f1f421b7b126d95afd6fc97d7a650e5fc3b38bfb/easybuild/tools/robot.py#L403)
* only relevant to pick up custom `robot_paths` for a specific easyconfig
* [ESSENTIAL] when installing easyconfigs (see `build_and_install_software` in `main.py`)
* Update build opts (this time using `ec.custom_build_opts`) at https://github.com/easybuilders/easybuild-framework/blob/f1f421b7b126d95afd6fc97d7a650e5fc3b38bfb/easybuild/main.py#L125
* Restore original build options at the end of the iteration
special cases
- `--from-pr`: needs to be taken into more places (`det_easyconfig_paths`)
- `--include-easyblocks-from-pr`: included easyblocks are set up *very* early (directly after option parsing)
- `update_build_option` needs to re-do setup of included easyblocks (from PR)
- `robot-paths` specified for specific easyconfig
issues
* semantics of `--copy-ec` + `--easystack`
* combining of configuration options from env/eb-arg + easystack file => which wins?
* semantics of using `--try-*` options in easystack file (see `tweak` function)