Local requirements

This commit is contained in:
2026-06-26 16:54:56 -05:00
parent ccc69857bb
commit 70b4517559
7 changed files with 57 additions and 15 deletions
+8 -1
View File
@@ -51,7 +51,7 @@ def _collect_profiles(project: Project) -> None:
def _collect_required(project: Project) -> None: def _collect_required(project: Project) -> None:
for required in project.requires: for required in project.requires:
_clone_then_load_required(required) _load_required(required)
def _collect_targets(project: Project) -> None: def _collect_targets(project: Project) -> None:
for target in project.targets: for target in project.targets:
@@ -127,6 +127,13 @@ def _inherit_target(target: Target, parent: Target) -> None:
if parent.type == Output.INT: if parent.type == Output.INT:
target.srcs.update([v for v in parent.srcs if v.level != Access.PRIVATE]) target.srcs.update([v for v in parent.srcs if v.level != Access.PRIVATE])
def _load_required(required: Dependency) -> None:
# Determine if local then load or clone then load.
if required.local:
load(Path(required.remote))
return
_clone_then_load_required(required)
def _clone_then_load_required(required: Dependency) -> None: def _clone_then_load_required(required: Dependency) -> None:
reqpath = Config.config_directory / required.cid reqpath = Config.config_directory / required.cid
if not Path.exists(reqpath): if not Path.exists(reqpath):
+8 -1
View File
@@ -1,6 +1,7 @@
import yaml import yaml
from dataclasses import dataclass from dataclasses import dataclass
from dataclasses import field
from typing import ClassVar from typing import ClassVar
from typing import Self from typing import Self
@@ -15,7 +16,13 @@ class Dependency(yaml.YAMLError):
yaml_tag: ClassVar[str] = u"!dependency" yaml_tag: ClassVar[str] = u"!dependency"
remote: str remote: str
branch: Branch branch: Branch = field(default="main")
local: bool = field(default=False)
def __post_init__(self) -> None:
from urllib.parse import urlparse
url = urlparse(self.remote)
self.local = not url.scheme
@property @property
def cid(self) -> str: def cid(self) -> str:
+10 -6
View File
@@ -23,14 +23,15 @@ def build(
commands: list[Command] = [] commands: list[Command] = []
for target in project.targets: for target in project.targets:
commands.extend(_prepare_dependencies(appcfg, target, logger)) commands.extend(_prepare_dependencies(appcfg, project, target, logger))
commands.extend(prepare(appcfg, project, target, logger)) commands.extend(prepare(appcfg, project, target, logger))
return execute(commands, "Building") return execute(commands, "Building")
def _prepare_dependencies( def _prepare_dependencies(
appcfg: Config, appcfg: Config,
target: Target, project: Project,
logger: Logger = _logger target: Target,
logger: Logger = _logger
) -> list[Command]: ) -> list[Command]:
from ..management import find_target_by_name from ..management import find_target_by_name
from ..management import find_project_by_target from ..management import find_project_by_target
@@ -41,6 +42,9 @@ def _prepare_dependencies(
dependency = find_target_by_name(required.value) dependency = find_target_by_name(required.value)
if dependency._prepared: if dependency._prepared:
continue continue
project = find_project_by_target(required.value) parent = find_project_by_target(required.value)
commands.extend(prepare(appcfg, project, target, logger)) if project.cid != parent.cid:
if required.value not in parent.exports:
raise Exception(f"Cannot depend on non-exported target: {required.value}")
commands.extend(prepare(appcfg, parent, target, logger))
return commands return commands
+9 -6
View File
@@ -24,7 +24,7 @@ def test(
commands: list[Command] = [] commands: list[Command] = []
for target in project.tests: for target in project.tests:
commands.extend(_prepare_dependencies(appcfg, target, logger)) commands.extend(_prepare_dependencies(appcfg, project, target, logger))
commands.extend(prepare(appcfg, project, target, logger)) commands.extend(prepare(appcfg, project, target, logger))
results = execute(commands, "Building") results = execute(commands, "Building")
@@ -36,9 +36,10 @@ def test(
return results return results
def _prepare_dependencies( def _prepare_dependencies(
appcfg: Config, appcfg: Config,
target: Target, project: Project,
logger: Logger = _logger target: Target,
logger: Logger = _logger
) -> list[Command]: ) -> list[Command]:
from ..management import find_target_by_name from ..management import find_target_by_name
from ..management import find_project_by_target from ..management import find_project_by_target
@@ -49,6 +50,8 @@ def _prepare_dependencies(
dependency = find_target_by_name(required.value) dependency = find_target_by_name(required.value)
if dependency._prepared: if dependency._prepared:
continue continue
project = find_project_by_target(required.value) parent = find_project_by_target(required.value)
commands.extend(prepare(appcfg, project, dependency, logger)) if project.cid != parent.cid and required not in parent.exports:
raise Exception(f"Cannot depend on non-exported target: {required}")
commands.extend(prepare(appcfg, parent, target, logger))
return commands return commands
+4 -1
View File
@@ -10,4 +10,7 @@ targets:
- name: hello - name: hello
type: program type: program
deps: [example] deps: [example]
srcs: [./entry.cpp] srcs: [./entry.cpp]
exports:
- example
+13
View File
@@ -0,0 +1,13 @@
name: local
gpid: examples
semv: 1.0.0
requires:
- remote: examples/archive
targets:
- name: hello
type: program
deps: [example] # Comes from local required
srcs:
- ./entry.cpp
+5
View File
@@ -0,0 +1,5 @@
extern "C" void print(const char* str);
int main() {
print("Hello, World!");
}