GNU Make fail с помощью foreach-> eval-> call - PullRequest
3 голосов
/ 03 ноября 2011

Поэтому у меня возникли проблемы при попытке сжать несколько повторяющихся строк в make-файле вида:

dir := XXX  
include dir/Makefile  
VAR_1 += $(VAR2)    # where VAR2 and VAR4 are defined in the included makefile    
VAR_3 += $(VAR4)    

К форме, подобной:

dir:= XXX1 XXX2 XXX3 ...
$(foreach elements,$(dir),$(eval $(call function,$(elements))))

define function  
$(eval include $(1)/Makefile)  
$(eval VAR_1+=$$(VAR2))  
$(eval VAR_3+=$$(VAR4))  
endef

Однако я получаю ошибки в том, что кажется, что make-файл не может определить, как создавать файлы. Я новичок в make-файлах, и я пробовал много вариантов функций, foreach и т. Д., Но ничего не работает. Если я положу все обратно в каждую строку, изложенную явно, все строит нормально. Есть что-то очевидное, что я делаю неправильно?

1 Ответ

3 голосов
/ 03 ноября 2011

Когда у вас есть макросы в Makefile для базового синтаксиса определения или включения вещей (НЕ в зависимости или действия), эти макросы раскрываются сразу по мере чтения make-файла. Это действительно имеет смысл, так как make необходимо расширить их, чтобы понять, что читать. Но из-за этого важен порядок определений правил, в частности, другие макросы, которые будут определены позже в файле, еще не будут определены и будут расширяться как пустые.

В вашем примере это происходит с function - когда make идет на выполнение foreach, function еще не определено как что-либо, поэтому оно заканчивается расширением до нуля. Таким образом, в конечном итоге вы не включаете ни один из необходимых подфайлов.

Переместить строку $(foreach ... ПОСЛЕ define function / endef

Кроме того, вам не нужны дополнительные eval вызовы внутри функции (хотя в этом случае они, вероятно, ничего не повредят, они могут привести к неожиданным результатам, если VAR2 или VAR4 расширятся до чего-либо с помощью $ в нем.)

...