Como tirar variáveis de outro Makefile no shell script

2

Eu quero usar as variáveis de outro Makefile sob o diretório ~/kernelbuild/linux-3.14.37 no meu próprio shell script.

A seguir estão as variáveis que eu preciso:

VERSION = 3
PATCHLEVEL = 14
SUBLEVEL = 37

O problema é que não tenho permissão para alterar o Makefile , portanto, a variável de exportação não é uma opção aqui.

Além disso, tenho visto pessoas dizendo ter um arquivo separado que contém todas as variáveis comuns necessárias. Isso é prático, mas eu preciso colocar tudo apenas no meu script de shell único .

Eu tentei incluir . ~/kernelbuild/linux-3.14.37/Makefile no meu shell script e achei que deveria poder usar essas variáveis, mas isso me dá erros a seguir:

/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 1: VERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 2: PATCHLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 3: SUBLEVEL: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 4: EXTRAVERSION: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 5: NAME: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 17: MAKEFLAGS: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 20: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 26: unexport: command not found
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: syntax error near unexpected token '"$(origin V)",'
/home/jl4347/kernelbuild/linux-3.14.37/Makefile: line 47: 'ifeq ("$(origin V)", "command line")'

Eu acho que é porque o Makefile não está seguindo as regras de sintaxe para o shell script. Como posso fazer isso então?

Obrigado antecipadamente!

    
por Jialun Liu 29.03.2015 / 20:47

3 respostas

2

Você pode tentar extrair os valores com grep e sed. Por exemplo:

filename="$HOME/kernelbuild/linux-3.14.37/Makefile"
version=$(grep -m 1 VERSION $filename | sed 's/^.*= //g')

Este greps para a primeira ocorrência de "VERSION" no Makefile

    
por 29.03.2015 / 20:57
4

Se você precisa apenas de coisas simples como o seu exemplo, apenas grep deles fora do Makefile.

Para coisas mais complicadas, o GNU Make tem uma opção -p que imprime o banco de dados depois de executar o Make, que inclui todas as definições de variáveis (e muito mais). Você pode usá-lo junto com -n , o que faz com que as ações não sejam realmente executadas (para que nada seja construído). Você pode grep das variáveis do -p output.

    
por 29.03.2015 / 20:59
2

Make pode ler um makefile de stdin, então você pode dar um documento aqui que é um makefile. A seguir está um makefile que inclui o makefile do kernel e adiciona um novo destino curinga, %.var , cuja receita gerará o valor da variável de criação fornecida. (Isso pressupõe que você não tem arquivos ou outros destinos que terminem em .var , é claro).

showvar() {
make -f - ${1}.var <<'EOF'
include $(HOME)/kernelbuild/linux-3.14.37/Makefile

%.var:
    @echo $($*)
EOF
}

my_version=$(showvar VERSION)
patchlevel=$(showvar PATCHLEVEL)
the_sublevel=$(showvar SUBLEVEL)

O Make substituirá $* pelo radical da meta %.var .

A linha de receita @echo começa com um caractere real TAB .

    
por 29.03.2015 / 23:42