diff options
author | Andreas Kling <kling@serenityos.org> | 2020-05-20 14:23:30 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-05-20 16:24:26 +0200 |
commit | 3d02b23af5d7ae16d71bcf9823ee63b4fec1d29a (patch) | |
tree | 961521b39cd457eba8e31384ced4759411bcde2a /Toolchain/ComputeDependenciesHash.sh | |
parent | 59c3b3b702d946ced9e62b4c56aa8fa2448e835d (diff) | |
download | serenity-3d02b23af5d7ae16d71bcf9823ee63b4fec1d29a.zip |
Revert "Toolchain: Don't pre-build LibC and LibM, nor pre-install their headers"
This reverts commit 4e051c6c15f25b58ee67127a9e4bd5e7a8684fea.
Diffstat (limited to 'Toolchain/ComputeDependenciesHash.sh')
-rwxr-xr-x | Toolchain/ComputeDependenciesHash.sh | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/Toolchain/ComputeDependenciesHash.sh b/Toolchain/ComputeDependenciesHash.sh index c6cb714e2b..0da2cf2a76 100755 --- a/Toolchain/ComputeDependenciesHash.sh +++ b/Toolchain/ComputeDependenciesHash.sh @@ -23,11 +23,67 @@ function finish { } trap finish EXIT -# Patches and the scripts are the only things that affect the build of the toolchain -FILE_LIST=$(find Toolchain/Patches -name "*.patch") +# libstdc++ depends on libc and libm, so we pessimistically assume it depends +# on *all* of their implementation and recursive dependencies. +# Scan all files for potential dependencies. +# Thinking in graphs, this computes the edge list: +cat <(find AK/ Libraries/ Services/ Kernel/ -name '*.h') \ + <(find Libraries/LibC/ Libraries/LibM/ -name '*.cpp' ! -name 'Test*.cpp' ) | \ + xargs grep -F '#include ' | \ + sed -r \ + -e 's,^(.*/)([^/]+:)#include "(.*)",\1\2\1\3,' \ + -e 's^#include <(Kernel/.*)>^\1^' \ + -e 's^#include <(AK/.*)>^\1^' \ + -e 's^#include <(Lib[A-Za-z]+/.*)>^Libraries/\1^' \ + -e 's^#include <((bits|netinet|sys|arpa|net)/.*)>^Libraries/LibC/\1^' \ + -e 's^#include <fd_set.h>^Libraries/LibC/fd_set.h^' \ + -e 's^#include <([a-z]{3,10}(_numbers)?\.h)>^Libraries/LibC/\1^' \ + -e 's^#include <([A-Z][a-z]+Server/.*)>^Services/\1^' \ + -e 's^#include <(.*)>^UNRESOLVED_I/\1^' \ + -e 's^#include "(.*)"^UNRESOLVED_L/\1^' > "${DEPLIST_FILE}" +# Some #include's cannot be resolved, like <chrono>. However, these are only +# a problem if they turn up as a transitive dependency of libc and libm. +# We will check for that when the time comes. + +# The initial guess is pessimistic: *all* of libc and libm. +FILE_LIST=$(find Libraries/LibC/ Libraries/LibM/ \( -name '*.cpp' -o -name '*.c' -o -name '*.h' \) ! -name 'Test*') +echo "$0: Exploring dependencies of libstdc++" >&2 +FILE_LIST_COMPLETE="n" +# In each iteration, we extend FILE_LIST by the dependencies not listed yet in +# FILE_LIST. Note that the results are always semantically the same, +# but the order depends on the initial `find` runs. +for _ in $(seq 10) ; do + FILE_REGEX=$(echo "${FILE_LIST}" | sed -zr -e 's,\n$,,' -e 's,\.,\\.,g' -e 's,\n,|,g') + FURTHER_FILE_LIST=$(grep -P "^(${FILE_REGEX}):" "${DEPLIST_FILE}" | grep -Pv ":(${FILE_REGEX})\$" | sed -re 's,^.*:(.*)$,\1,' | sort -u) + if [ -n "${FURTHER_FILE_LIST}" ] ; then + # FILE_LIST should grow to a maximum of "number of all .cpp and .c and .h files", + # i.e. roughly 700 lines. This should be managable, even as the project grows. + FILE_LIST="${FILE_LIST} +${FURTHER_FILE_LIST}" + else + FILE_LIST_COMPLETE="y" + break + fi +done +FURTHER_FILE_LIST="" +FILE_REGEX="" +if [ "${FILE_LIST_COMPLETE}" != "y" ] ; then + # Dependency chains might grow very long. Also, if for some reason we fail + # to filter out the already listed files, the FILE_LIST would grow + # exponentially. Both of these unpleasant cases are handled by capping the + # iteration count to 10 and giving up: + echo "$0: Dependencies don't seem to converge, giving up." >&2 + exit 1 +fi # Sort for reproducability, FILE_LIST=$(echo "${FILE_LIST}" | LC_ALL=C sort -u) +if grep -F 'UNRESOLVED' <<EOLIST >&2 ; then +${FILE_LIST} +EOLIST + echo "$0: Unresolved dependency, giving up." + exit 1 +fi echo "$0: Computing hashes" >&2 # "$@" is the md5sum invocation. The piping might hide non-zero exit-codes, |