GNU Make fail с вызовом foreach-›eval-›

Поэтому у меня возникли проблемы с попыткой сжать кучу повторяющихся строк в 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

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


person user1026438    schedule 02.11.2011    source источник


Ответы (1)


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

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

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

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

person Chris Dodd    schedule 02.11.2011