[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>
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.
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.
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.