Экспорт рекурсивных переменных make-файла в субмаки - PullRequest
3 голосов
/ 17 октября 2011

Мне нужно экспортировать пользовательскую функцию make GNU (т. Е. рекурсивно расширенную переменную make-файла ) в подмодель. Тем не менее, make, кажется, расширяет все такие переменные до просто расширенных переменных, что делает их бесполезными.

Вот пример:

Содержимое "parent.make":

export myfunc = my arg is $1
$(info parent testing myfunc: $(call myfunc,parent))
all: ; $(MAKE) -f child.make

Содержимое "child.make":

$(info child testing myfunc: $(call myfunc,child))
nullrule: ; @true

Запуск «make -f parent.make» приводит к следующему выводу:

parent testing myfunc: my arg is parent
make -f child.make
child testing myfunc: my arg is 

Родитель экспортирует myfunc как простую расширенную переменную, содержащую «my arg is», в суб-марку, что делает его бесполезным в качестве функции.

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Есть ли причина, по которой общие переменные и функции не могут быть помещены в отдельный make-файл, включаемый как родительским, так и дочерним make-файлами?

1 голос
/ 17 октября 2011

Я не уверен, что это удовлетворит ваши требования, но здесь идет:

parent.make:

export myfunc1 = my arg is $1
export myfunc2 = $(value myfunc1)
$(info parent testing myfunc1: $(call myfunc1,parent))
all: ; $(MAKE) -f child.make

child.make:

$(info child testing myfunc2: $(call myfunc2,child))
nullrule: ; @true

EDIT:
Хорошо, как насчет этого:

child.make:

myfunc1=$(myfunc2)

$(info child testing myfunc1: $(call myfunc1,child))
nullrule: ; @true

EDIT:

Не так быстро. Посмотрите на это:

parent.make:

myfunc_base = my arg is $1

export myfunc = $(value myfunc_base)

$(info parent testing myfunc: $(call myfunc_base,parent))
all: ; @$(MAKE) -f child.make

child.make:

$(info child testing myfunc: $(call myfunc,child))
nullrule: ;  @$(MAKE) -f grandchild.make

grandchild.make:

$(info grandchild testing myfunc: $(call myfunc,grandchild))
nullrule: ; @true

Это работает без каких-либо изменений child.make или grandchild.make. Требуется, чтобы parent.make звонил myfunc_base, а не myfunc; если это проблема, есть способ обойти ее, может быть, больше, чем один.

Одна возможность, мы перенесем определение в любые вызовы parent, где оно вообще не будет вызываться:

grandparent.make:

myfunc_base = my arg is $1

export myfunc = $(value myfunc_base)

all: ; @$(MAKE) -f child.make

parent.make:

$(info parent testing myfunc: $(call myfunc,parent))
all: ; @$(MAKE) -f child.make

Я понимаю, что это может быть неосуществимо, так как определение myfunc может потребовать других вещей, определенных в parent.make. Посмотрите, подойдет ли это вашей ситуации; может быть другой путь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...