Прежде всего, метод, который вы используете, немного сбивает с толку. Все файлы .h, используемые при компиляции одного файла .cpp, должны храниться в его зависимостях, и автоматический сбор файлов * .o не должен быть медленным . Я бы посоветовал перейти к классическому -MM и составить список файлов cpp, которые должны быть скомпилированы вручную. Automake делает это таким образом, и если бы был действительно надежный способ автоматически определить список модулей компиляции, эти ребята нашли бы это: -).
Тем не менее, опция -H gcc вам поможет. Он печатает имена всех используемых файлов в stderr, с помощью. с префиксом для уровня включения. Таким образом,
cpp -I $< >/dev/null | sed -n -e 's/^\. //p'
должен сделать свое дело. Предостережение: если заголовочный файл сначала включается глубже в иерархию, а затем в основной файл, он не обнаруживается. Однако ваша система зависимостей должна справиться с этим, если вы сохраните файлы «1: 1» в файлах .h и .cpp.