App.__get_project_refs(): Fix broken detection of missing build dependencies #94
Loading…
Reference in a new issue
No description provided.
Delete branch "jan/fix/20260910-broken-detection-of-missing-build-dependencies"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR adds a series of commits leading up to cleaner detection of missing build dependencies.
App.find_dir(): Allow restricting the project roots
find_dir() and its helpers resolve a project name against the workspace root and /opt. The build iteration needs to resolve a module against the workspace only, to tell buildable projects apart from installed ones.
Add a projs_roots parameter to find_dir(), __find_dir() and __proj_dir() that restricts the search to the given roots. With the parameter omitted the previous behavior is unchanged.
CmdBuild.run_make(): Skip projects without buildable dir
The iteration order contains every project the dependency walk resolved, including projects that are only installed as -devel packages below /opt. Running the target in such a project ran make in a read-only, source-less directory and failed the run.
Resolve each module against the workspace root only, and skip the target with a notice when there is no buildable project directory. Factor the skip notice into log_skip() so the platform-exclusion path shares it.
App.is_installed(): Add method
The installed state of a project is judged by the proofs of installation, which differ per subpackage: make/project.conf in the dev tree or /opt proves the -devel package or a buildable checkout, a VERSION file in the project directory or /usr/share/doc/packages the -run package.
Add is_installed(), which answers the proof question for a given subpackage by searching the per-subpackage locations.
App.__get_project_refs(): Fix recursion stop conditions
App.__get_project_refs() recurses into the package dependency graph, but the recursion end conditions only work well if all required packages are present. Whether a required package is installed or not is decided upon a wrong condition, however - existence of the project's project directory, which may or may not be misleading for both the -devel and the -run requirements. This can lead to various unwanted outcomes: Missing packages happily inserted into the recursion buffer, process termination instead of recursion stop, path lookup errors instead of a clearer "unmet dependency" message (No project path found for module xyz, Failed to find directory of project foo).
This commit cleanly detects if -run or -devel are installed and makes the walk stop or raise under the appropriate conditions:
c52453dc682ae101d93b