Local requirements
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
extern "C" void print(const char* str);
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
print("Hello, World!");
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user