make: override: Comando não encontrado

1

Durante make clean , estou tentando substituir determinada variável para garantir todas as saídas foram limpas:

clean-lib:
    override ARCH=32
    rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a
    override ARCH=64
    rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

LIBNAME é construído como:

ARCH=64
PROJNAME=libWebSightR220
LIBNAME=$(PROJNAME)x$(ARCH)

Espera-se que o usuário use make lib ARCH=32 para 32 build. Meu código para alterar ARCH throws:

make: override: Command not found

Eu também tentei atualizar o make, mas ele já está atualizado:

XXXXX@debianvirtualbox:~/$ make --version
GNU Make 4.0
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
    
por Tomáš Zato 30.09.2015 / 14:24

2 respostas

2

Isso não tem nada a ver com a versão do make, você está usando. O comando que você coloca após a linha 'target: dependencies' é executado através do shell e simplesmente não há comando do Linux chamado override . override é uma diretiva make interna e não pode vir nessa posição. Funcionaria, e. assim:

override ARCH=64
all:
    echo $(ARCH)

EDITAR: A maneira de conseguir o que você quer (pelo menos com o GNU make) é a seguinte

all:
    $(eval override ARCH=32)
    echo $(ARCH)
    $(eval override ARCH=64)
    echo $(ARCH)

BTW: desta forma, tanto make ARCH=45 como ARCH=45 make produziriam "32 \ n64", sem o override o primeiro produziria "45 \ n45" e apenas o último imprimiria "32 \ n64". / p>     

por 30.09.2015 / 14:35
1

Make não avalia atribuições de variáveis em linhas de receita de construção; eles são estritamente código shell.

No GNU Make, você pode usar uma atribuição de variável específica de destino para alterar temporariamente o valor de uma variável sobre a execução de regras que atualizam um determinado alvo. Para aproveitar isso, dividimos a regra em duas partes:

.PHONY: clean-lib-32 clean-lib-64 clean-lib

clean-lib: clean-lib-32 clean-lib-64

# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64

clean-lib-32 clean-lib-64:
        rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

Para que isso funcione, NEWLIB tem que ser uma variável atrasada, não uma variável imediata. Isso é para dizer:

NEWLIB = whatever$(ARCH)whateverelse

# NOT this:
NEWLIB := whatever$(ARCH)whateverelse

As variáveis criadas usando = armazenam o texto não expandido, que é expandido no momento em que são substituídas (como macros semelhantes), enquanto que := variables armazenam o texto expandido que não contém mais expansões quando é substituído posteriormente. Obviamente, precisamos de $(ARCH) para ser substituído tardiamente, para que sua designação específica do alvo tenha efeito.

Caso de teste completo:

$ cat Makefile
.PHONY: clean-lib-32 clean-lib-64 clean-lib

NEWLIB = newlib/
LIBNAME = lib-$(ARCH)

clean-lib: clean-lib-32 clean-lib-64

# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64

clean-lib-32 clean-lib-64:
        echo rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

Podemos limpar a biblioteca de 32 bits usando seu destino específico:

$ make clean-lib-32
echo rm -rf newlib/lib-32.so  newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a

Da mesma forma com a biblioteca de 64 bits

$ make clean-lib-64
echo rm -rf newlib/lib-64.so  newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a

Podemos limpar os dois usando o destino genérico clean-lib :

$ make clean-lib
echo rm -rf newlib/lib-32.so  newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
echo rm -rf newlib/lib-64.so  newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a
    
por 01.10.2015 / 20:40

Tags