I. Introdução
A função de chamada é uma função de referência que pode personalizar os parâmetros da função. Usando esta função pode realizar a referência à função definida pelo usuário. Também é possível definir uma variável como uma expressão complexa e usar a função de chamada para expandi-la de acordo com diferentes parâmetros para obter resultados diferentes.
eval expande seus parâmetros, e o resultado expandido é usado como parte do Makefile.A função eval os substitui e os expande de acordo com o relacionamento e a estrutura de seus parâmetros.
2. função de chamada
1. Definição
$(call VARIALBLE,PARAM,PARAM,...)
2. Funções
Durante a execução, atribua o parâmetro "PARAM" às variáveis temporárias "$(1)", "$(2)" e assim sucessivamente e, finalmente, obtenha o valor calculado da expressão "VARIABLE" .
3. Valor de retorno
Após o valor do parâmetro "PARAM" substituir "$(1)" e "$(2)" sucessivamente, o valor calculado da expressão definida pela variável "VARIABLE".
Os exemplos são os seguintes :
define test
foo:=$(1)
endef
$(warning $(call test,apple))
all:
@echo foo=$(foo).
结果:
test1.mk:8: foo:=apple
foo=.
Como pode ser visto acima, a função da instrução $(warning $(call test,apple)) é que a função call chama a expressão "test" e passa em "apple", e o resultado retornado pela expressão "test" é "foo:=apple", observe que "foo:=apple" é apenas um valor de retorno da função de chamada , quando make analisa esse Makefile, ele não analisará a instrução "foo:=apple". Portanto, no final, o valor de foo ainda está vazio.
3. A função de avaliação
1. Definição
$(eval ...)
2. Funções
A função eval expande seus parâmetros e o resultado expandido é usado como parte do Makefile, e make pode analisar o conteúdo expandido. A análise dessas três frases é a seguinte:
A função "eval" expande seus argumentos :
A função eval irá expandir os parâmetros que a seguem.Se houver chamadas indiretas para outras variáveis, elas serão expandidas juntas aqui para obter o valor da expressão ou variável final. Os exemplos são os seguintes:
apple_tree:=3
define test
foo:=$($(1)_tree)
endef
$(warning $(eval $(call test,apple)))
all:
@echo foo=$(foo).
结果:
test23.mk:8:
foo=3.
Como pode ser visto acima, o valor calculado da expressão retornada pela função "$(call test,apple)" é "foo:=$(apple_tree)". Portanto, neste momento, "foo:=$(apple_tree)" é usado como parâmetro da função eval, e a função eval irá expandi-lo para obter a instrução "foo:=3".
O resultado da expansão como parte do Makefile :
A função eval pegará o resultado da expansão de seus parâmetros como parte do Makefile, ou seja, o make irá analisar o "resultado da expansão" ao analisar o Makefile. Referindo-se ao exemplo acima, após a operação de expansão de eval, "foo:=3" é obtido, que é a primeira operação da função eval, e a próxima operação é usar "foo:=3" como parte do Makefile , que são as duas primeiras etapas .
make pode analisar o conteúdo expandido :
Finalmente, depois que make analisa o Makefile, o valor de foo é 3.
3. Valor de retorno
O valor de retorno da função "eval" está vazio ou pode não haver valor de retorno.
3. Resumo
A função da call function é pegar os parâmetros da função e expandir as expressões e variáveis na função. O valor de retorno da função é o resultado após a expansão. No entanto, o resultado expandido não faz parte do Makefile. Quando make analisa o Makefile, a análise não é para ele. A função eval primeiro expande seus parâmetros e, em seguida, usa o resultado expandido como parte do Makefile, que pode ser analisado por make.