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
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!
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
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.
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 .