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:
for required in project.requires:
_clone_then_load_required(required)
_load_required(required)
def _collect_targets(project: Project) -> None:
for target in project.targets:
@@ -127,6 +127,13 @@ def _inherit_target(target: Target, parent: Target) -> None:
if parent.type == Output.INT:
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:
reqpath = Config.config_directory / required.cid
if not Path.exists(reqpath):
+8 -1
View File
@@ -1,6 +1,7 @@
import yaml
from dataclasses import dataclass
from dataclasses import field
from typing import ClassVar
from typing import Self
@@ -15,7 +16,13 @@ class Dependency(yaml.YAMLError):
yaml_tag: ClassVar[str] = u"!dependency"
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
def cid(self) -> str:
+10 -6
View File
@@ -23,14 +23,15 @@ def build(
commands: list[Command] = []
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))
return execute(commands, "Building")
def _prepare_dependencies(
appcfg: Config,
target: Target,
logger: Logger = _logger
appcfg: Config,
project: Project,
target: Target,
logger: Logger = _logger
) -> list[Command]:
from ..management import find_target_by_name
from ..management import find_project_by_target
@@ -41,6 +42,9 @@ def _prepare_dependencies(
dependency = find_target_by_name(required.value)
if dependency._prepared:
continue
project = find_project_by_target(required.value)
commands.extend(prepare(appcfg, project, target, logger))
parent = find_project_by_target(required.value)
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
+9 -6
View File
@@ -24,7 +24,7 @@ def test(
commands: list[Command] = []
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))
results = execute(commands, "Building")
@@ -36,9 +36,10 @@ def test(
return results
def _prepare_dependencies(
appcfg: Config,
target: Target,
logger: Logger = _logger
appcfg: Config,
project: Project,
target: Target,
logger: Logger = _logger
) -> list[Command]:
from ..management import find_target_by_name
from ..management import find_project_by_target
@@ -49,6 +50,8 @@ def _prepare_dependencies(
dependency = find_target_by_name(required.value)
if dependency._prepared:
continue
project = find_project_by_target(required.value)
commands.extend(prepare(appcfg, project, dependency, logger))
parent = find_project_by_target(required.value)
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
+3
View File
@@ -11,3 +11,6 @@ targets:
type: program
deps: [example]
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!");
}