Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
CMake
Контекст CMake — не пакетный менеджер, а генератор сборочных систем: из
CMakeLists.txtон создаёт нативные сборочные файлы (Ninja, Make, проекты Visual Studio). Для SCA это означает, что CMake описывает намерение слинковать цели и найти библиотеки, но сам по себе не гарантирует ни версию, ни факт линковки.
Для чего
CMake разрешает, какие библиотеки нужны цели (find_package, target_link_libraries), куда смотреть за заголовками, и каким компилятором собирать. В контексте инвентаризации C/C++ он ценен как источник декларации зависимостей и как точка, где можно снять граф целей и перехватить реальные вызовы компилятора (через compile_commands.json).
Как применяют
Граф зависимостей целей в формате Graphviz:
cmake -S . -B build --graphviz=deps.dot
dot -Tsvg deps.dot -o deps.svg
База реальных команд компиляции (вход для build‑scan и cdxgen):
cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON # → build/compile_commands.json
Машинная модель проекта через CMake File API (каталог‑запрос .cmake/api/v1/query/) отдаёт JSON с целями, ссылками и путями к библиотекам — это надёжнее, чем парсить CMakeLists.txt глазами.
Сильные стороны
compile_commands.json— точный список того, что и с какими-I/-L/-lкомпилируется; основа для перехвата реальных, а не задекларированных зависимостей.- File API и
--graphvizдают машинную модель графа целей без запуска самой сборки до конца. find_packageпомечает, какие компоненты ищутся как внешние, — отправная точка для разметки.
Ограничения
find_package(OpenSSL)находит то, что лежит в системе, и не фиксирует версию — на другой машине подтянется другая. Lockfile отсутствует как класс.FetchContent/ExternalProjectзатягивают исходники по URL/commit в обход любого пакетного менеджера — их легко упустить при инвентаризации.- Декларация ≠ факт: цель может быть объявлена, но статически вшита или, наоборот, не слинкована. Реальный состав даёт только анализ артефакта.
Offline / on-premise
Да. CMake — локальный инструмент без сетевых зависимостей. Сетевые риски вносят не сам CMake, а вызовы FetchContent_Declare(... GIT_REPOSITORY ...)/ExternalProject, тянущие код из интернета во время конфигурации; в закрытом контуре их перенаправляют на внутренние зеркала или заменяют vendored‑исходниками.
Связанные темы
М09 C/C++ legacy · М05 Генерация SBOM · П20. CMake dependency graph · П19. C C++ make build inventory · П31. Пилот CodeScoring make CMake qmake · Conan · vcpkg · pkg-config · cdxgen