[lldb][CMake] Enforce lldbUtility and lldbHost layering invariants (#198952)

lldbUtility cannot depend on any other lldb library, and lldbHost can
only depend on lldbUtility. Breaking those invariants is an easy mistake
to make and has happened repeatedly: most recently in #198931.

Because LLDB statically links its libraries on macOS, a stray LINK_LIBS
entry, or a stray cross-library #include without a matching CMake
dependency, both succeed at link time and only surface much later as a
layering bug.

Add two configure-time checks in `add_lldb_library` so the build fails
fast when these invariants are broken:

1. A new `ALLOWED_INTERNAL_DEPENDENCIES <list>` parameter allowlists
which `^lldb`-prefixed `LINK_LIBS` entries a target may depend on. The
existing `NO_INTERNAL_DEPENDENCIES` flag is the empty-allowlist case and
continues to work.

2. Whenever either of those is set, also scan the target's sources and
public headers for `#include "lldb/<Library>/..."` directives outside
the allowlist, and FATAL_ERROR with the offending file and line. This
catches the macOS static-linking case where a missing CMake dependency
silently resolves at link time.

Apply the new parameter to lldbHost (allowing only lldbUtility plus the
Darwin Objective-C++ shim lldbHostMacOSXObjCXX) and to that shim itself.
lldbUtility already used `NO_INTERNAL_DEPENDENCIES` and now picks up the
header scan automatically.

`lldb/Host/windows/windows.h` is special-cased in the scan: it is a
system-header wrapper used tree-wide and carries no real dependency.

Drop two unused `lldb/Target/*` includes from `Utility/FileSpecList.cpp`
that the scan would otherwise flag.

Assisted-by: Claude

---------

Co-authored-by: Charles Zablit <c_zablit@apple.com>
4 files changed
tree: 66abe931709ac8569af1f70de8e528a186c7d4d4
  1. .ci/
  2. .github/
  3. bolt/
  4. clang/
  5. clang-tools-extra/
  6. cmake/
  7. compiler-rt/
  8. cross-project-tests/
  9. flang/
  10. flang-rt/
  11. libc/
  12. libclc/
  13. libcxx/
  14. libcxxabi/
  15. libsycl/
  16. libunwind/
  17. lld/
  18. lldb/
  19. llvm/
  20. llvm-libgcc/
  21. mlir/
  22. offload/
  23. openmp/
  24. orc-rt/
  25. polly/
  26. runtimes/
  27. third-party/
  28. utils/
  29. .clang-format
  30. .clang-format-ignore
  31. .clang-tidy
  32. .git-blame-ignore-revs
  33. .gitattributes
  34. .gitignore
  35. .mailmap
  36. CODE_OF_CONDUCT.md
  37. CONTRIBUTING.md
  38. LICENSE.TXT
  39. pyproject.toml
  40. README.md
  41. SECURITY.md
README.md

The LLVM Compiler Infrastructure

OpenSSF Scorecard OpenSSF Best Practices libc++

Welcome to the LLVM project!

This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.

The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.

C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.

Other components include: the libc++ C++ standard library, the LLD linker, and more.

Getting the Source Code and Building LLVM

Consult the Getting Started with LLVM page for information on building and running LLVM.

For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.

Getting in touch

Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.

The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.