Skip to content

Commit 256be48

Browse files
authored
[ATFE] Improve error handling and header optimisation in common header generation logic. (#456)
This patch introduces additional error checking and handle edge cases in common header generation script. 1. Adds a check to handle cases where the multilib folder is either empty or does not exist, avoiding unhandled exceptions. 2. Improves logic by allowing header optimisation to proceed for targets that have more than two variants, even if another target lacks sufficient variants for a comparison. These changes ensure the script can still performing valid optimisations where possible. 3. Copying multilib.yaml can be moved outside the loop, as it only needs to be done once after all target folders are generated.
1 parent ca741f1 commit 256be48

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

arm-software/embedded/arm-multilib/common-headers-generate.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,24 @@ def extract_common_headers_for_targets(args):
5656
if os.path.exists(args.multilib_optimised_dir):
5757
shutil.rmtree(args.multilib_optimised_dir)
5858

59+
if os.path.isdir(args.multilib_non_optimised_dir):
60+
existing_target_dirs = [
61+
dir_name
62+
for dir_name in MULTILIB_TARGET_DIRS
63+
if os.path.isdir(os.path.join(args.multilib_non_optimised_dir, dir_name))
64+
]
65+
if not existing_target_dirs:
66+
raise Exception(
67+
f"Error: Expected to find either arm-none-eabi or aarch64-none-elf in '{args.multilib_non_optimised_dir}', but folder is empty."
68+
)
69+
src_yaml = os.path.join(args.multilib_non_optimised_dir, "multilib.yaml")
70+
if not os.path.exists(src_yaml):
71+
raise FileNotFoundError(f"Source yaml '{src_yaml}' does not exist.")
72+
else:
73+
raise FileNotFoundError(
74+
f"Error: Expected folder '{args.multilib_non_optimised_dir}' does not exist"
75+
)
76+
5977
for target in MULTILIB_TARGET_DIRS:
6078
input_target_dir = os.path.join(
6179
os.path.abspath(args.multilib_non_optimised_dir), target
@@ -80,16 +98,12 @@ def extract_common_headers_for_targets(args):
8098
# The script always creates the multilib-optimised folder, even when there's only one variant and no
8199
# optimization is applied. In that case, multilib-optimised will just contain a copy of the
82100
# single variant from the non-optimised multilib directory.
83-
if os.path.exists(args.multilib_non_optimised_dir):
84-
shutil.copytree(
85-
args.multilib_non_optimised_dir,
86-
args.multilib_optimised_dir,
87-
dirs_exist_ok=True,
88-
)
89-
return
101+
if os.path.exists(input_target_dir):
102+
shutil.copytree(input_target_dir, output_target_dir, dirs_exist_ok=False)
103+
continue
90104

91105
# Creating the common include headers for each target
92-
os.makedirs(output_include_dir, exist_ok=True)
106+
os.makedirs(output_include_dir, exist_ok=False)
93107

94108
# Step 1: compare first two variants and extract the common headers into the targets common include directory
95109
base_dir = list(variant_includes.values())[0]
@@ -143,13 +157,10 @@ def extract_common_headers_for_targets(args):
143157
else:
144158
print(f"Warning: {src_dir} does not exist and will be skipped.")
145159

146-
# Step4: Copy multilib.yaml file as it is from the non-optimised multilib directoy.
147-
src_yaml = os.path.join(args.multilib_non_optimised_dir, "multilib.yaml")
148-
dst_yaml = os.path.join(args.multilib_optimised_dir, "multilib.yaml")
149-
if os.path.exists(src_yaml):
150-
shutil.copy2(src_yaml, dst_yaml)
151-
else:
152-
raise FileNotFoundError(f"Source yaml '{src_yaml}' does not exist.")
160+
# Step4: Copy multilib.yaml file as it is from the non-optimised multilib directoy.
161+
src_yaml = os.path.join(args.multilib_non_optimised_dir, "multilib.yaml")
162+
dst_yaml = os.path.join(args.multilib_optimised_dir, "multilib.yaml")
163+
shutil.copy2(src_yaml, dst_yaml)
153164

154165

155166
def main():

0 commit comments

Comments
 (0)