LINUX.ORG.RU

Чтение мейкфайлов из поддиректорий без рекурсивного вызова Make

 


0

2

Сабж. Как это делается красиво и правильно? Когда-то давно, да поздно ночью родил вот такой костылище, сейчас увидел - ужаснулся:

define parse_subdir
$(eval dir=$(1))\
$(eval subdirs=$(addprefix $(1),$(filter %/,$(subdirs-y))))\
$(eval vfiles+=$(addprefix $(1), $(filter-out %/,$(rtl-y))))\
$(eval ucffiles+=$(addprefix $(1), $(filter-out %/,$(ucf-y))))\
$(eval vhifiles+=$(addprefix $(1), $(filter-out %/,$(vhi-y))))\
$(eval rtl-y= )\
$(eval ucf-y= )\
$(eval subdirs-y= )\
$(eval vhi-y= )\
$(foreach dir, $(subdirs),$(eval include $(dir)Makefile) $(call parse_subdir,$(dir)))
endef

define load_submakes
include $(1)Makefile
load_makes=     $$(call parse_subdir, $(1)) 
$$(load_makes)
endef

$(eval $(call load_submakes,$(TOP_DIR)/verilog/))

Сейчас вычищаю, упаковвываю в 'бутылочные рецепты', но просто интересно, может это реализуется как-то проще?

★★★★★
Ответ на: комментарий от Skolotovich

Нет конечно, без рекурсивного вызова make надо. Проблема в том, что мне нужно в топ-левеле иметь список всех файлов проекта. В верилоге в отличие от С нельзя закомпилить built-in.o, и для каждого сабдира подсосать dir/built-in.o. Как вариант можно в этот файлик писать тупо список файлов, но хотелось бы обойтись без 100500 временных файлов. Решение выше работает, но выглядит зело стремно.

AiFiLTr0 ★★★★★
() автор топика
Ответ на: комментарий от AiFiLTr0

Нет конечно, без рекурсивного вызова make надо. Проблема в том, что мне нужно в топ-левеле иметь список всех файлов проекта. В верилоге в отличие от С нельзя закомпилить built-in.o, и для каждого сабдира подсосать dir/built-in.o. Как вариант можно в этот файлик писать тупо список файлов, но хотелось бы обойтись без 100500 временных файлов. Решение выше работает, но выглядит зело стремно.

имхо, мейк без рекурсии пользовать нет смысла

а так несколько вариантов

1) держать список всех файлов с путями в переменной и уже проходиться по нему, можно туда их заносить автоматом с помощью какого нибудь find

2) во временную директорию выносить симлинки на файлы вида dir1_dir2_filename.ext (дабы коллизий небыло) и работать уже с симлинками

3) работает - не трогай ((:

Skolotovich ★★★
()
Ответ на: комментарий от Skolotovich

1. Не подходит, так как список файлов формируется из конфига при чтение подкаталогов.

2. выглядит как извращение, да и не хочется делать тонны симлинков.

3. по ходу придется оставить этот вариант.

AiFiLTr0 ★★★★★
() автор топика
Ответ на: комментарий от AiFiLTr0

3. по ходу придется оставить этот вариант.

это лучший выход из положения ((:

а 1 и 2 таки извращения, зато без рекурсии (:

Skolotovich ★★★
()

Может в заметке «recursive make considered harmful» есть что-то подходящее, точно не скажу - помню плохо.

anonymous
()
Ответ на: комментарий от anonymous

Посмотрел. Тамошняя реализация не шибко подходит под мои цели, так что по ходу /me остается на своем старом костыле.

AiFiLTr0 ★★★★★
() автор топика
Ответ на: комментарий от AiFiLTr0

Да и сложнее местами выходит.

AiFiLTr0 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.