twister: add option to create shorter build paths
Add possibility to create shorter build paths when --short-build-path option is enabled. This can help during run Twister on Windows OS and building programs by CMake which has a problem when paths with building files are too long. The solution based on symbolic links which help to connect "traditional" long paths with shorter one like: "twister_links/test_0". Fixes #41929 Signed-off-by: Piotr Golyzniak <piotr.golyzniak@nordicsemi.no>
This commit is contained in:
parent
1563b2c990
commit
b618f4bf8e
2 changed files with 60 additions and 1 deletions
|
@ -2812,6 +2812,9 @@ class TestSuite(DisablePyTestCollectionMixin):
|
|||
# run integration tests only
|
||||
self.integration = False
|
||||
|
||||
# used during creating shorter build paths
|
||||
self.link_dir_counter = 0
|
||||
|
||||
self.pipeline = None
|
||||
self.version = "NA"
|
||||
|
||||
|
@ -3898,6 +3901,48 @@ class TestSuite(DisablePyTestCollectionMixin):
|
|||
logger.error(f"{log_info} - unrecognized platform - {platform}")
|
||||
sys.exit(2)
|
||||
|
||||
def create_build_dir_links(self):
|
||||
"""
|
||||
Iterate through all no-skipped instances in suite and create links
|
||||
for each one build directories. Those links will be passed in the next
|
||||
steps to the CMake command.
|
||||
"""
|
||||
|
||||
links_dir_name = "twister_links" # folder for all links
|
||||
links_dir_path = os.path.join(self.outdir, links_dir_name)
|
||||
if not os.path.exists(links_dir_path):
|
||||
os.mkdir(links_dir_path)
|
||||
|
||||
for instance in self.instances.values():
|
||||
if instance.status != "skipped":
|
||||
self._create_build_dir_link(links_dir_path, instance)
|
||||
|
||||
def _create_build_dir_link(self, links_dir_path, instance):
|
||||
"""
|
||||
Create build directory with original "long" path. Next take shorter
|
||||
path and link them with original path - create link. At the end
|
||||
replace build_dir to created link. This link will be passed to CMake
|
||||
command. This action helps to limit path length which can be
|
||||
significant during building by CMake on Windows OS.
|
||||
"""
|
||||
|
||||
os.makedirs(instance.build_dir, exist_ok=True)
|
||||
|
||||
link_name = f"test_{self.link_dir_counter}"
|
||||
link_path = os.path.join(links_dir_path, link_name)
|
||||
|
||||
if os.name == "nt": # if OS is Windows
|
||||
command = ["mklink", "/J", f"{link_path}", f"{instance.build_dir}"]
|
||||
subprocess.call(command, shell=True)
|
||||
else: # for Linux and MAC OS
|
||||
os.symlink(instance.build_dir, link_path)
|
||||
|
||||
# Here original build directory is replaced with symbolic link. It will
|
||||
# be passed to CMake command
|
||||
instance.build_dir = link_path
|
||||
|
||||
self.link_dir_counter += 1
|
||||
|
||||
|
||||
class CoverageTool:
|
||||
""" Base class for every supported coverage tool
|
||||
|
|
|
@ -569,7 +569,8 @@ structure in the main Zephyr tree: boards/<arch>/<board_name>/""")
|
|||
|
||||
parser.add_argument(
|
||||
"-N", "--ninja", action="store_true",
|
||||
help="Use the Ninja generator with CMake.")
|
||||
help="Use the Ninja generator with CMake.",
|
||||
required="--short-build-path" in sys.argv)
|
||||
|
||||
parser.add_argument(
|
||||
"-n", "--no-clean", action="store_true",
|
||||
|
@ -684,6 +685,16 @@ structure in the main Zephyr tree: boards/<arch>/<board_name>/""")
|
|||
help="Execute time-consuming test cases that have been marked "
|
||||
"as 'slow' in testcase.yaml. Normally these are only built.")
|
||||
|
||||
parser.add_argument(
|
||||
"--short-build-path",
|
||||
action="store_true",
|
||||
help="Create shorter build directory paths based on symbolic links. "
|
||||
"The shortened build path will be used by CMake for generating "
|
||||
"the build system and executing the build. Use this option if "
|
||||
"you experience build failures related to path length, for "
|
||||
"example on Windows OS. This option can be used only with "
|
||||
"'--ninja' argument (to use Ninja build generator).")
|
||||
|
||||
parser.add_argument(
|
||||
"--show-footprint", action="store_true",
|
||||
help="Show footprint statistics and deltas since last release."
|
||||
|
@ -1236,6 +1247,9 @@ def main():
|
|||
logger.info("Completed in %d seconds" % (duration))
|
||||
return
|
||||
|
||||
if options.short_build_path:
|
||||
suite.create_build_dir_links()
|
||||
|
||||
retries = options.retry_failed + 1
|
||||
completed = 0
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue