Вы можете использовать gcc
или cpp
в режиме зависимости. Например, cpp -MM
создает правила Makefile для файлов C:
$ cpp -MM abstract.c
abstract.o: abstract.c differ.h overrides.h debug.h settings.h abstract.h \
abstract/posix.h abstract/linux.h misc.h command.h queue.h list.h \
storage.h sqlite3.h
Вы можете проанализировать этот вывод, чтобы получить список включенных файлов. cpp
прекрасно работает и с исходными файлами C ++, поэтому у вас не должно возникнуть проблем в этом направлении.
Однако вы должны позаботиться о предоставлении тех же опций препроцессора, что и при обычной компиляции.
EDIT:
Поскольку zip
обновляет файлы с одинаковыми именами в архиве, вы можете использовать что-то вроде этого:
$ for i in *.c *.cc; do cpp -MM "$i"; done | tr ' ' '\n' | sort -u | grep -v ':$' | xargs -r zip test.zip
updating: test2.cc (deflated 61%)
adding: greater.c (deflated 38%)
adding: test.cc (deflated 61%)
adding: yyy.h (stored 0%)
adding: zzz.h (stored 0%)
$ for i in *.c *.cc; do cpp -MM "$i"; done | tr ' ' '\n' | sort -u | grep -v ':$' | xargs -r zip test.zip
updating: test2.cc (deflated 61%)
updating: greater.c (deflated 38%)
updating: test.cc (deflated 61%)
updating: yyy.h (stored 0%)
updating: zzz.h (stored 0%)
Хранит файлы, включенные в указанные исходные файлы, вместе с самими исходными файлами в архиве zip
. Обратите внимание, что вы должны позаботиться о том, чтобы каждый исходный файл обрабатывался с правильными параметрами cpp
.