Цитата(Огурцов @ Dec 15 2012, 12:54)

Не вижу ни строчки похожей на типа:
А Вы не могли бы чётче говорить, что Вам нужно?
Я же переспросил:
«Что значит „обрабатывать не файл, а каталог”?»Вы на это ничего не ответили, просто «OK, а как бы вы решили». А уже потом на другой мой ответ -- «не вижу». Так и никогда не увидите.
При желании Вы всегда сможете придумать еще что-то, что не упоминалось в предыдущих сообщениях темы и опять будет «не вижу», так как ответы даются только на то, о чём уже
говорилось и без телепатии дать ответ на то, что Вы при этом
думали -- невозможно.
Но, тем не менее, направление было указано в одном из сообщений темы, на которую я дал ссылку. Там кроме objcopy для объектных ещё генерировались h-файлы. Попроще, но генерировались.
Вот так можно сделать то, о чём Вы сейчас написали.
Код
BINEXTS = bin raw
BINDIRS = ./binfiles
BINFILES = $(foreach ext,$(BINEXTS),$(wildcard $(addsuffix /*.$(ext), $(BINDIRS))))
BINNAMES = $(notdir $(BINFILES))
.PHONY: filesys.h
filesys.h :
@echo === Generate $@
@echo "#define file_count $(words $(BINNAMES))" >$@
@echo "$(foreach file,$(BINNAMES),const char $(subst .,_,$(file))[]=\"$(file)\";\n)" >>$@
@echo "const struct file_entry {" >>$@
@echo " uint32_t size;" >>$@
@echo " const unsigned char * pname;" >>$@
@echo " const unsigned char * pdata;" >>$@
@echo "} catalog[file_count] = {" >>$@
@echo "$(foreach file,$(BINNAMES),{$(addprefix $(subst .,_,$(file)),_size, _name, _data)},\n)" >>$@
@echo "};" >>$@
Имеем:
Код
$ ls binfiles/
file1.bin file2.bin file3.bin file4.raw
$ make filesys.h
=== Generate filesys.h
$ cat filesys.h
#define file_count 4
const char file1_bin[]="file1.bin";
const char file2_bin[]="file2.bin";
const char file3_bin[]="file3.bin";
const char file4_raw[]="file4.raw";
const struct file_entry {
uint32_t size;
const unsigned char * pname;
const unsigned char * pdata;
} catalog[file_count] = {
{file1_bin_size, file1_bin_name, file1_bin_data},
{file2_bin_size, file2_bin_name, file2_bin_data},
{file3_bin_size, file3_bin_name, file3_bin_data},
{file4_raw_size, file4_raw_name, file4_raw_data},
};
При таком построении filesys.h будет генерироваться заново при каждой сборке, что не есть хорошо, так как потянет перекомпиляцию зависимого (не знаю, как у Вас организован процесс с самописной программой).
Можно по другому:
Код
filelist:
@echo === Generate filelist.h
@echo "#define file_count $(words $(BINNAMES))" >filelist.h
@echo "$(foreach file,$(BINNAMES),const char $(subst .,_,$(file))[]=\"$(file)\";\n)" >>filelist.h
и так далее. При этом нужно вручную перегенерировать filelist.h при изменении какого-то из файлов или добавлении/убирании.
Я бы сделал по другому, разбил это Ваше
Код
const struct file_entry {
uint32_t size;
const unsigned char * pname;
const unsigned char * pdata;
} catalog [file_count] = {
{file_1_size, file_1_name, file_1_data},
{file_2_size, file_2_name, file_2_data},
...............
}
на два файла, .c и .h. В .h только
Код
typedef struct file_entry_t {
uint32_t size;
const unsigned char * pname;
const unsigned char * pdata;
};
#define file_count что там выйдет
extern const file_entry_t catalog [file_count];
Каждый из двоичных файлов перегнал бы в отдельный соответствующий .c и filelist.h filelist.c поставил бы в зависимость от полного списка этих c-файлов.
При добавлении bin/raw файла список становился бы другим, причём добавленный файл оказывался бы новее, чем filelist и была бы автоматическая перегенерация только когда надо. Само собой при изменении какого-то из бинарных тоже перекомпиляция. В остальных случаях без лишних телодвижений.
А вообще ребята правы, пора переходить с make на scons. Только вломно после 25+ лет «мейканья». Конечно, в те времена он попроще был, но выручал.