Como passar o argumento para o Makefile da linha de comando?
Eu entendo que posso fazer
$ make action VAR="value"
$ value
com Makefile
VAR = "default"
action:
@echo $(VAR)
Como obtenho o seguinte comportamento?
$ make action value
value
?
E se
$make action value1 value2
value1 value2
command-line
parameters
makefile
arguments
Meng Lu
fonte
fonte
Respostas:
Você provavelmente não deveria fazer isso; você está quebrando o padrão básico de como o Make funciona. Mas aqui está:
EDIT:
Para explicar o primeiro comando,
$(MAKECMDGOALS)
é a lista de "alvos" explicitada na linha de comando, por exemplo, "ação valor1 valor2".$@
é uma variável automática para o nome do destino da regra, neste caso "ação".filter-out
é uma função que remove alguns elementos de uma lista. Então$(filter-out bar, foo bar baz)
retornafoo baz
(pode ser mais sutil, mas não precisamos de sutileza aqui).Reúna-os e
$(filter-out $@,$(MAKECMDGOALS))
retorna a lista de destinos especificados na linha de comando diferente de "ação", que pode ser "valor1 valor2".fonte
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')
omitir todos os alvos antes e apenas considerar o seguinte como argumentos:make target1 target2 action value1 value2
%:
e@:
não consigo encontrar informações sobre o que essas "diretivas" (ou o que quer que sejam chamadas) fazem. Você poderia explicar?%:
e@:
é uma regra . O nome do alvo%
significa que é uma regra que corresponde a tudo ; ou seja, se o Make não conseguir encontrar nenhuma outra maneira de construir o que você disse para construir, ele executará essa regra. O@:
é uma receita ; os:
meios não fazem nada e os@
meios o fazem silenciosamente.%:
na verdade% :
, um nome de destino do tipo curinga. Não vejo nada nessa página de manual a respeito@:
... sugere que uma regra "não fazer nada" simplesmente teria um;
após a especificação de destino, então, não seria mais preciso escrever% : ;
como o "curinga faça -nada "regra?filter-out
não funciona quando a ação é uma dependência do destino especificado na linha de comando, porque$@
será definido como o nome da dependência, não o argumento original chamado na linha de comando. Em vez disso, atribuoMAKECMDGOALS
a uma matriz de shell e removo o primeiro elemento:@ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")
Aqui está uma solução de trabalho genérica baseada em @ Beta's
Estou usando o GNU Make 4.1 com
SHELL=/bin/bash
no topo do meu Makefile, então YMMV!Isso nos permite aceitar argumentos extras (sem fazer nada quando obtemos um trabalho que não corresponde, em vez de gerar um erro).
E esta é uma macro que obtém os argumentos para nós:
Aqui está um trabalho que pode chamar este:
O resultado seria:
Nota! Talvez seja melhor usar um "Arquivo de tarefas", que é um padrão bash que funciona de forma semelhante ao make, mas sem as nuances do Maketools. Veja https://github.com/adriancooney/Taskfile
fonte
tab
antes@echo
, nãospace
.Abordagem muito mais fácil. Considere uma tarefa:
Agora, quando quero chamá-lo, apenas executo algo como:
AT="build assets" make provision
ou apenas:
make provision
neste casoAT
é uma string vaziafonte
não tente fazer isso
em vez disso, crie o script:
e faça isso:
para obter mais explicações sobre por que fazer isso e advertências sobre hackeamento de makefile, leia minha resposta a outra pergunta muito semelhante, mas aparentemente não duplicada: Passando argumentos para "make run"
fonte