gnuMake, Como ter uma substituição de variável de ambiente

3

Atualmente, estou trabalhando com Makefiles que têm definições como

MYLIB=/.../mylib-1.2.34

O problema é que estes são diferentes para desenvolvedores diferentes, e é uma dor ter que editar novamente o arquivo após cada checkout.

Então, tentei exportar uma variável de ambiente específica e, em seguida, fazer

MYLIBX:=$(MYLIB_ENV)
MYLIBX?=MYLIB

O problema é que, se MYLIB_ENV não estiver definido, ele ainda cria um MYLIBX vazio, portanto, o? = não funciona. Existe uma maneira limpa de fazer essa coisa básica?

Estou trabalhando com um conjunto "rico" de arquivos de criação desenvolvidos ao longo de muitos anos que fazem todo tipo de coisas, como fazer e chamar uns aos outros, portanto, mudar as coisas profundamente não é uma opção.

SOLUÇÃO

Reprodução aleatória dupla. MYLIB já definido.

MYLIB_ENV?=MYLIB
MYLIB:=MYLIB_ENV
    
por Tuntable 09.03.2017 / 05:04

2 respostas

5

O problema com

MYLIB:=$(MYLIB_ENV)
MYLIB?=/.../mylib-1.2.34

é que MYLIB é sempre definido na primeira linha, então o segundo nunca se aplica.

A abordagem típica nessa situação é apenas

MYLIB?=/.../mylib-1.2.34

Dessa forma, desenvolvedores individuais podem especificar seu próprio valor a partir do shell, seja na linha de comando make

make MYLIB=...

ou em seu ambiente antes de executar make

export MYLIB=...
make

(para que eles possam defini-lo uma vez, por exemplo. em seus scripts de inicialização do shell, e esquecê-lo).

Se você acabou de executar

make

sem especificar um valor para MYLIB , o padrão /.../mylib-1.2.34 é usado.

Outra opção é determinar onde o Makefile é armazenado , mas isso não funciona em todos os casos (em particular, se o caminho para o Makefile contém espaços).

    
por 09.03.2017 / 07:20
2

Não está muito claro o que é exatamente o que você está procurando. Mas caso você queira substituir as configurações da variável make MYLIB para algo diferente do que é especificado no Makefile SEM ter que editar o Makefile para isso, então é muito simples: Em make invocations, especifique MYLIB na linha de comando com um valor de sua escolha, como:

make -f yourmakefile yourtarget MYLIB="I_need_my_personal_value"

Outro método:

MYLIB := ORIGINAL_VALUE

ifneq '$(MYLIB_ENV)' ''
MYLIB := $(MYLIB_ENV)
endif
    
por 09.03.2017 / 05:35

Tags