Skip to content

Commit 921c954

Browse files
build: Track all folders for syscall gen
Currently, for syscall generation, cmake is only tracking folders under ${ZEPHYR_BASE}/include. However, folders are actually used from a number of different paths including those provided by clients. This commit adds dependency tracking for all of those sources. Signed-off-by: Mark Inderhees <[email protected]>
1 parent e9cb4eb commit 921c954

File tree

2 files changed

+60
-32
lines changed

2 files changed

+60
-32
lines changed

CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -828,11 +828,17 @@ get_property(
828828
list(APPEND SYSCALL_INCLUDE_DIRS ${syscalls_include_list})
829829

830830
# Walk dependencies to find all subfolders
831+
foreach(d IN LISTS SYSCALL_SCAN_DIRS SYSCALL_INCLUDE_DIRS)
832+
list(APPEND syscalls_subfolders
833+
--directory ${d}
834+
)
835+
endforeach()
836+
831837
execute_process(
832838
COMMAND
833839
${PYTHON_EXECUTABLE}
834840
${ZEPHYR_BASE}/scripts/build/subfolder_list.py
835-
--directory ${ZEPHYR_BASE}/include # Walk this directory
841+
${syscalls_subfolders} # Walk these directories
836842
--out-file ${syscalls_subdirs_txt} # Write file with discovered folder
837843
--trigger-file ${syscalls_subdirs_trigger} # Trigger file that is used for json generation
838844
${syscalls_links} # If defined, create symlinks for dependencies
@@ -869,7 +875,7 @@ else()
869875
COMMAND
870876
${PYTHON_EXECUTABLE}
871877
${ZEPHYR_BASE}/scripts/build/subfolder_list.py
872-
--directory ${ZEPHYR_BASE}/include # Walk this directory
878+
${syscalls_subfolders} # Walk these directories
873879
--out-file ${syscalls_subdirs_txt} # Write file with discovered folder
874880
--trigger-file ${syscalls_subdirs_trigger} # Trigger file that is used for json generation
875881
${syscalls_links} # If defined, create symlinks for dependencies

scripts/build/subfolder_list.py

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ def parse_args():
2121
formatter_class=argparse.RawDescriptionHelpFormatter,
2222
allow_abbrev=False)
2323

24-
parser.add_argument('-d', '--directory', required=True,
25-
help='Directory to walk for sub-directory discovery')
24+
parser.add_argument('-d', '--directory', required=True, action='append',
25+
help='Directory to walk for sub-directory discovery \
26+
(can be specified multiple times)')
2627
parser.add_argument('-c', '--create-links', required=False,
2728
help='Create links for each directory found in \
2829
directory given')
@@ -37,34 +38,54 @@ def parse_args():
3738
return args
3839

3940

40-
def get_subfolder_list(directory, create_links=None):
41-
"""Return subfolder list of a directory"""
41+
def get_subfolder_list(directories, create_links=None):
42+
"""Return subfolder list of directories"""
4243
dirlist = []
43-
44-
if create_links is not None:
45-
if not os.path.exists(create_links):
46-
os.makedirs(create_links)
47-
symbase = os.path.basename(directory)
48-
symlink = create_links + os.path.sep + symbase
49-
if not os.path.exists(symlink):
50-
os.symlink(directory, symlink)
51-
dirlist.append(symlink)
52-
else:
53-
dirlist.append(directory)
54-
55-
for root, dirs, _ in os.walk(directory, topdown=True):
56-
dirs.sort()
57-
for subdir in dirs:
58-
if create_links is not None:
59-
targetdirectory = os.path.join(root, subdir)
60-
reldir = os.path.relpath(targetdirectory, directory)
61-
linkname = symbase + '_' + reldir.replace(os.path.sep, '_')
62-
symlink = create_links + os.path.sep + linkname
63-
if not os.path.exists(symlink):
64-
os.symlink(targetdirectory, symlink)
65-
dirlist.append(symlink)
66-
else:
67-
dirlist.append(os.path.join(root, subdir))
44+
used_link_names = set()
45+
46+
for directory in directories:
47+
if create_links is not None:
48+
if not os.path.exists(create_links):
49+
os.makedirs(create_links)
50+
symbase = os.path.basename(directory)
51+
52+
# Ensure unique link name for the base directory
53+
linkname = symbase
54+
counter = 1
55+
while linkname in used_link_names:
56+
linkname = f"{symbase}_{counter}"
57+
counter += 1
58+
used_link_names.add(linkname)
59+
60+
symlink = create_links + os.path.sep + linkname
61+
if not os.path.exists(symlink):
62+
os.symlink(directory, symlink)
63+
dirlist.append(symlink)
64+
else:
65+
dirlist.append(directory)
66+
67+
for root, dirs, _ in os.walk(directory, topdown=True):
68+
dirs.sort()
69+
for subdir in dirs:
70+
if create_links is not None:
71+
targetdirectory = os.path.join(root, subdir)
72+
reldir = os.path.relpath(targetdirectory, directory)
73+
base_linkname = os.path.basename(directory) + '_' + reldir.replace(os.path.sep, '_')
74+
75+
# Ensure unique link name for subdirectories
76+
linkname = base_linkname
77+
counter = 1
78+
while linkname in used_link_names:
79+
linkname = f"{base_linkname}_{counter}"
80+
counter += 1
81+
used_link_names.add(linkname)
82+
83+
symlink = create_links + os.path.sep + linkname
84+
if not os.path.exists(symlink):
85+
os.symlink(targetdirectory, symlink)
86+
dirlist.append(symlink)
87+
else:
88+
dirlist.append(os.path.join(root, subdir))
6889

6990
return dirlist
7091

@@ -108,7 +129,8 @@ def main():
108129
"""Parse command line arguments and take respective actions"""
109130
args = parse_args()
110131

111-
dirs = get_subfolder_list(args.directory, args.create_links)
132+
directories = sorted(set(args.directory))
133+
dirs = get_subfolder_list(directories, args.create_links)
112134
gen_out_file(args.out_file, dirs)
113135

114136
# Always touch trigger file to ensure json files are updated

0 commit comments

Comments
 (0)