diff --git a/build_manager/manager.py b/build_manager/manager.py index b3fad5c..066fa6e 100644 --- a/build_manager/manager.py +++ b/build_manager/manager.py @@ -48,7 +48,8 @@ def __init__(self, remote_info: RemoteInfo, git_hash: str, board: str, - selected_features: set) -> None: + selected_features: set, + custom_defines: list[tuple[str, str | None]] = []) -> None: """ Initialize build information object including vehicle, remote, git hash, selected features, and progress of the build. @@ -61,12 +62,15 @@ def __init__(self, git_hash (str): The git commit hash to build on. board (str): Board to build for. selected_features (set): Set of features selected for the build. + custom_defines (list[tuple[str,str|None]]): Custom defines to + pass to the build. """ self.vehicle_id = vehicle_id self.remote_info = remote_info self.git_hash = git_hash self.board = board self.selected_features = selected_features + self.custom_defines = custom_defines self.progress = BuildProgress( state=BuildState.PENDING, percent=0 @@ -81,6 +85,7 @@ def to_dict(self) -> dict: 'git_hash': self.git_hash, 'board': self.board, 'selected_features': list(self.selected_features), + 'custom_defines': self.custom_defines, 'progress': self.progress.to_dict(), 'time_created': self.time_created, 'time_started': getattr(self, 'time_started', None), diff --git a/builder/builder.py b/builder/builder.py index 7a16cb1..591cbb9 100644 --- a/builder/builder.py +++ b/builder/builder.py @@ -72,6 +72,14 @@ def __log_build_info(self, build_id: str) -> None: "Selected Features:\n") for d in build_info.selected_features: build_log.write(f"{d}\n") + if build_info.custom_defines: + build_log.write("---\n" + "Custom defines:\n") + for define, value in build_info.custom_defines: + if value: + build_log.write(f"{define}={value}\n") + else: + build_log.write(f"{define}\n") build_log.write("---\n") def __generate_extrahwdef(self, build_id: str) -> None: @@ -119,6 +127,8 @@ def __generate_extrahwdef(self, build_id: str) -> None: self.logger.info(f"Enabled defines for {build_id}: {enabled_defines}") self.logger.info(f"Disabled defines for {build_id}: {enabled_defines}") + custom_defines = build_info.custom_defines + with open(self.__get_path_to_extra_hwdef(build_id), "w") as f: # Undefine all defines at the beginning for define in all_defines: @@ -129,6 +139,10 @@ def __generate_extrahwdef(self, build_id: str) -> None: # Disable the remaining defines for define in disabled_defines: f.write(f"define {define} 0\n") + for define, value in custom_defines: + if value is None: + value = "" + f.write(f"define {define} {value}\n") def __ensure_remote_added(self, remote_info: RemoteInfo) -> None: """ diff --git a/web/api/v1/builds.py b/web/api/v1/builds.py index d0f0ab9..b3e8f79 100644 --- a/web/api/v1/builds.py +++ b/web/api/v1/builds.py @@ -41,7 +41,7 @@ async def create_build( Args: build_request: Build configuration including vehicle, board, version, - and selected features + selected features and custom defines Returns: Simple response with build_id, URL, and status diff --git a/web/schemas/builds.py b/web/schemas/builds.py index 57b59bb..665ed65 100644 --- a/web/schemas/builds.py +++ b/web/schemas/builds.py @@ -31,6 +31,9 @@ class BuildRequest(BaseModel): default_factory=list, description="Feature IDs to enable for this build" ) + custom_defines: str = Field( + ..., description="Custom defines to pass to this build" + ) # --- Build Submit Response --- diff --git a/web/services/builds.py b/web/services/builds.py index 691577b..c99d9a3 100644 --- a/web/services/builds.py +++ b/web/services/builds.py @@ -136,13 +136,29 @@ def create_build( f"{commit_ref}" ) + # Parse custom defines string + custom_defines = [] + if build_request.custom_defines: + custom_define_strings = build_request.custom_defines.split(',') + for custom_define in [s.strip() for s in custom_define_strings]: + if "=" in custom_define: + split_string = custom_define.split('=') + if len(split_string) != 2: + raise ValueError("Failed to parse custom define") + define, value = split_string + else: + define = custom_define + value = None + custom_defines.append((define, value)) + # Create build info build_info = build_manager.BuildInfo( vehicle_id=vehicle_id, remote_info=remote_info, git_hash=git_hash, board=board_name, - selected_features=selected_feature_defines + selected_features=selected_feature_defines, + custom_defines=custom_defines ) # Submit build diff --git a/web/static/js/add_build.js b/web/static/js/add_build.js index b3caba8..8be0564 100644 --- a/web/static/js/add_build.js +++ b/web/static/js/add_build.js @@ -693,13 +693,17 @@ async function handleFormSubmit(event) { // The checkbox ID is already the feature define (ID) selected_features.push(checkbox.id); }); - + + // Collect custom defines + const custom_defines = document.getElementById('custom_defines').value; + // Create build request payload const buildRequest = { vehicle_id: vehicle_id, version_id: version_id, board_id: board_id, - selected_features: selected_features + selected_features: selected_features, + custom_defines: custom_defines, }; // Send POST request to API diff --git a/web/templates/add_build.html b/web/templates/add_build.html index 6c97488..e737b5c 100644 --- a/web/templates/add_build.html +++ b/web/templates/add_build.html @@ -86,6 +86,14 @@ +
+
+
+
+ +
+
+