Usando eval no arquivo make

0

Eu executo um build de buildroot e durante esse processo de criação um arquivo de texto é criado. Depois disso, outro make, como parte da construção, é executado. Eu quero ler o conteúdo do arquivo gerado em uma variável e usá-los. Isso não funciona como no começo do meu buildroot, ele vê o arquivo como não existente, então mesmo que ele seja gerado antes do código ser executado, o make já decidiu que ele não existe.

Formato do arquivo lido:

  str1 str2 1.1.0_nightlybuild (1389:1497M@trunk)

Estou tentando usar o eval (isso deve verificar o conteúdo do arquivo no momento da execução). No entanto, o problema persistir, parece que não consigo ler o arquivo depois que ele é criado. Parece que o make pode estar expandindo a variável e então o eval não funciona.

Nenhuma das variáveis está sendo definida a partir do conteúdo do arquivo. Eu verifiquei e o arquivo foi gerado corretamente, então se eu executar o make novamente, quando o arquivo já tiver sido gerado, tudo funcionará bem. A eval não é a maneira correta de fazer isso?

Portanto, o arquivo não existe no começo do make, existe e então esse código é executado:

define EXAMPLE
    $(eval s := $(shell cat output/target/version.txt)) 
    $(eval FILENAME_BIN=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).bin)
    $(eval FILENAME_JFFS2=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).jffs2)
    mv $(BINARIES_DIR)/$(BOOTIMAGE) $(BINARIES_DIR)/$(FILENAME_BIN)
    mv $(BINARIES_DIR)/$(JFFS2IMAGE) $(BINARIES_DIR)/$(FILENAME_JFFS2)
endef

Ele não funciona, o arquivo é gerado e as construções subseqüentes funcionarão, mas não a primeira em que o arquivo não existe no início do processo. A primeira vez que os arquivos são chamados simplesmente de ...bin e ...jffs2 , pois as variáveis lidas do arquivo não são preenchidas. Quando funciona, os arquivos são chamados str1.str2.1.1.0_nightlybuild.bin str1.str2. 1.1.0_nightlybuild.jffs2

Aqui está o makefile real de caso de uso link TEST_DEFAULT_RENAME é onde eu estou tentando ler em um arquivo, estou usando o buildroot (portanto, um muitos arquivos make), quando eu clico em make durante o processo buildroot version.txt é criado ao longo do caminho, este código então tenta ler este arquivo mas ele não funciona a menos que version.text esteja lá antes de eu inserir o make no buildroot diretório. Como você pode ver, eu uso version.txt em outro lugar via cat mas isso funciona bem.

    
por Paul 10.01.2017 / 15:30

1 resposta

4

A melhor solução é alterar o formato do seu arquivo para algo que make possa analisar diretamente e, em seguida, simples -include it. make saberá gerá-lo e automaticamente executar novamente após ter feito isso. Você pode fazer a conversão na regra que gera seu arquivo atual ou adicionar uma regra separada para gerar um arquivo diferente a partir dele.

Por exemplo, coloque isso em Makefile :

-include datafile

all: 
    echo VAR is $(VAR)

datafile: Makefile
    echo "VAR=value" > $@

Na primeira vez que você executar make , verá o comando que gera datafile . Se você usar make -d , verá uma linha que diz Re-executing[1]: make -d , que é onde make é executada novamente e pode ler o conteúdo de datafile .

Se você executar make once datafile , ele será executado apenas uma vez. Mas como ele tem uma dependência em Makefile , se você editar isso para alterar value para alguma outra string, datafile será regenerado corretamente.

    
por 10.01.2017 / 16:15