Сборочные файлы Soong не поддерживают условных операторов и выражений для ветвления, а только описывают структуру проекта, применяемые при сборке модули и зависимости. Подлежащие сборке файлы описываются при помощи масок и группируются в пакеты, каждый из который представляет собой коллекцию файлов с указанием связанных с ними зависимостей. Возможно определение переменных. Переменные и свойства строго типизированы (тип переменных выбирается динамически при первом присвоении, а для свойств статически в зависимости от типа модуля). Сложные элементы сборочной логики вынесены в обработчики, написанные на языке Go.
Soong переплетается с более общим проектом Blueprint, в рамках которого развивается не привязанная к Android мета-система сборки, которая на основе файлов с декларативными описаниями модулей, формирует сборочные сценарии Ninja (замена make), описывающие команды, которые необходимо выполнить для сборки, и зависимости. Вместо применения сложных правил или предметно ориентированного языка для определения логики сборки, в Blueprint применяются специфичные для собираемых проектов обработчики на языке Go (Soong является по сути набором подобных обработчиков для Android).
Подобный подход позволяет для больших и разнородных проектов, таких как Android, реализовать сложные элементы сборочной логики в коде на высокоуровневом языке программирования, при этом сохраняя возможность при помощи простого декларативного синтаксиса вносить в модули изменения, связанные с организацией сборки и структурой проекта. Например, в Soong выбор флагов компилятора производится обработчиком llvm.go, а применение специфичных для аппаратных архитектур настроек производится обработчиком art.go, но привязка файлов с кодом осуществляется в файле «.bp».
cc_library { ... srcs: ["generic.cpp"], arch: { arm: { srcs: ["arm.cpp"], }, x86: { srcs: ["x86.cpp"], }, }, }
Источник: http://www.opennet.ru/opennews/art.shtml?num=51769