/tools/make_libdeps.sh

https://github.com/FreeBSDonHyper-V/freebsd · Shell · 120 lines · 80 code · 9 blank · 31 comment · 5 complexity · 450d4779ad7dad83196c4c4037c08020 MD5 · raw file

  1. #!/bin/sh -e
  2. #
  3. # Copyright (c) 2002 Ruslan Ermilov, The FreeBSD Project
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. # 1. Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. # 2. Redistributions in binary form must reproduce the above copyright
  12. # notice, this list of conditions and the following disclaimer in the
  13. # documentation and/or other materials provided with the distribution.
  14. #
  15. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  16. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  19. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. # SUCH DAMAGE.
  26. #
  27. # $FreeBSD$
  28. export PATH=/bin:/usr/bin
  29. LC_ALL=C # make sort deterministic
  30. FS=': ' # internal field separator
  31. LIBDEPENDS=./_libdeps # intermediate output file
  32. USRSRC=${1:-/usr/src} # source root
  33. LIBS="
  34. lib
  35. gnu/lib
  36. kerberos5/lib
  37. secure/lib
  38. usr.bin/lex/lib
  39. cddl/lib
  40. " # where to scan for libraries
  41. # This sed(1) filter is used to convert -lfoo to path/to/libfoo.
  42. #
  43. SED_FILTER="
  44. sed -E
  45. -e's; ;! ;g'
  46. -e's;$;!;'
  47. -e's;-lbsdxml!;lib/libexpat;g'
  48. -e's;-lpthread!;lib/libthr;g'
  49. -e's;-lm!;lib/msun;g'
  50. -e's;-l(ncurses|termcap)!;lib/ncurses/ncurses;g'
  51. -e's;-l(gcc)!;gnu/lib/lib\1;g'
  52. -e's;-lssp_nonshared!;gnu/lib/libssp/libssp_nonshared;g'
  53. -e's;-l(asn1|hdb|kdc|heimbase|heimntlm|heimsqlite|hx509|krb5|roken|wind)!;kerberos5/lib/lib\1;g'
  54. -e's;-l(crypto|ssh|ssl)!;secure/lib/lib\1;g'
  55. -e's;-l([^!]+)!;lib/lib\1;g'
  56. "
  57. # Generate interdependencies between libraries.
  58. #
  59. genlibdepends()
  60. {
  61. (
  62. cd ${USRSRC}
  63. find -s ${LIBS} -mindepth 1 -name Makefile |
  64. xargs grep -l 'bsd\.lib\.mk' |
  65. while read makefile; do
  66. libdir=$(dirname ${makefile})
  67. deps=$(
  68. cd ${libdir}
  69. make -m ${USRSRC}/share/mk -V LDADD
  70. )
  71. if [ "${deps}" ]; then
  72. echo ${libdir}"${FS}"$(
  73. echo ${deps} |
  74. eval ${SED_FILTER}
  75. )
  76. fi
  77. done
  78. )
  79. }
  80. main()
  81. {
  82. if [ ! -f ${LIBDEPENDS} ]; then
  83. genlibdepends >${LIBDEPENDS}
  84. fi
  85. prebuild_libs=$(
  86. awk -F"${FS}" '{ print $2 }' ${LIBDEPENDS} | tr ' ' '\n' |
  87. sort -u
  88. )
  89. echo "Libraries with dependents:"
  90. echo
  91. echo ${prebuild_libs} | tr ' ' '\n'
  92. echo
  93. echo "List of interdependencies:"
  94. echo
  95. for lib in ${prebuild_libs}; do
  96. grep "^${lib}${FS}" ${LIBDEPENDS} || true
  97. done |
  98. awk -F"${FS}" '{
  99. if ($2 in dependents)
  100. dependents[$2]=dependents[$2]" "$1
  101. else
  102. dependents[$2]=$1
  103. }
  104. END {
  105. for (lib in dependents)
  106. print dependents[lib]": " lib
  107. }' |
  108. sort
  109. exit 0
  110. }
  111. main