Built-in build.config support (added scripts only)
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
from functools import cmp_to_key
|
||||
from os.path import basename, isfile, splitext
|
||||
from typing import Iterable, Optional, override
|
||||
|
||||
from .config import Config, FileConfig
|
||||
from .language import MakeDataConfig, MakeModData, MakeScriptData
|
||||
|
||||
|
||||
class BuildConfig(MakeDataConfig):
|
||||
def __init__(self, path: str, defaults: FileConfig) -> None:
|
||||
super().__init__(path, defaults)
|
||||
|
||||
@override
|
||||
def obtain_project_data(self) -> Optional[MakeModData]:
|
||||
mod_info_file = self.get_relative_path("mod.info")
|
||||
if isfile(mod_info_file):
|
||||
mod_info = FileConfig(mod_info_file)
|
||||
return self.obtain_mod_data(mod_info)
|
||||
|
||||
@property
|
||||
@override
|
||||
def supports_scripts(self) -> bool:
|
||||
return True
|
||||
|
||||
@override
|
||||
def iterate_scripts(self) -> Iterable[MakeScriptData]:
|
||||
sources_list = filter(
|
||||
lambda source: isinstance(source, Config),
|
||||
self.obtain_list("compile")
|
||||
)
|
||||
for source in sorted(sources_list, key=cmp_to_key(
|
||||
lambda a, b: \
|
||||
0 if a.get_value("sourceType") == "library" and b.get_value("sourceType") == "library" \
|
||||
else -1 if a.get_value("sourceType") == "library" else 1
|
||||
)):
|
||||
yield self.obtain_script_data(source)
|
||||
|
||||
def obtain_script_data(self, source: Config) -> MakeScriptData:
|
||||
relative_path = source.get_value_unsafe("path")
|
||||
from .script_build import VALID_SOURCE_TYPES
|
||||
type = source.get_value_unsafe("type")
|
||||
if type != "mod" and not type in VALID_SOURCE_TYPES:
|
||||
raise ValueError(f"Script {relative_path!r} has invalid type, it should be one of: {', '.join(VALID_SOURCE_TYPES)}!")
|
||||
|
||||
build_directory = next(
|
||||
filter(lambda directory: isinstance(directory, Config) \
|
||||
and output_path == directory.get_value("targetSource"), self.obtain_list("buildDirs")
|
||||
), None)
|
||||
if relative_path and build_directory:
|
||||
relative_path = build_directory.get_value("dir")
|
||||
output_path = source.get_value_unsafe("path")
|
||||
# Using template <sourceName>.<extension> -> <sourceName>, e.g. main.js -> main
|
||||
else:
|
||||
script_path = self.get_relative_path(relative_path)
|
||||
output_path = basename(script_path)
|
||||
if isfile(script_path):
|
||||
output_path = splitext(output_path)[0] + ".js"
|
||||
|
||||
return MakeScriptData(
|
||||
relative_path=relative_path,
|
||||
output_path=output_path,
|
||||
type=type if type != "mod" else "main",
|
||||
source_name=source.get_value("sourceName", lambda: relative_path),
|
||||
api=source.get_value("api"),
|
||||
optimization_level=source.get_value("optimizationLevel", -1)
|
||||
)
|
||||
|
||||
@property
|
||||
@override
|
||||
def supports_java(self) -> bool:
|
||||
return False
|
||||
|
||||
@property
|
||||
@override
|
||||
def supports_native(self) -> bool:
|
||||
return False
|
||||
|
||||
@property
|
||||
@override
|
||||
def supports_resources(self) -> bool:
|
||||
return False
|
||||
Reference in New Issue
Block a user