Makefile inclui o arquivo env

15

Estou tentando incluir algumas env vars em um Makefile. O arquivo env se parece com:

FOO=bar
BAZ=quux

Note que não há nenhum líder export para cada env var. Se eu adicionar o export e apenas include do arquivo env no Makefile, tudo funcionará como deveria. Mas eu preciso manter o comando env vars sans levando export . Isso me impede de usar apenas include envfile no Makefile.

Eu também tentei fazer algo assim:

sed '/^#/!s/^/export /' envfile > $(BUILDDIR)/env
include $(BUILDDIR)/env

Mas isso causa um erro porque o arquivo env não está incluído.

    
por Michael Irwin 10.10.2015 / 18:28

5 respostas

24

Se você está usando o gnu make, o que deve funcionar é incluir o arquivo envfile , então exportar a lista de vars obtida do mesmo arquivo:

#!make
include envfile
export $(shell sed 's/=.*//' envfile)

test:
        env
    
por 10.10.2015 / 20:54
13

Eu tive um problema semelhante e cheguei nesse tópico. Outra solução possível é apenas fazer o comando make export sem nenhum argumento:

include .env
export

Isso exportará todas as variáveis do make como variáveis de ambiente. Esse comportamento pode ou não corresponder a todos os casos de uso, mas funcionou para mim e não envolveu nenhuma magia de script de shell.

    
por 01.03.2017 / 17:36
3

Preserva vars ENV pré existentes

export $(shell [ ! -n "$(ENVFILE)" ] || cat $(ENVFILE) | grep -v \
    --perl-regexp '^('$$(env | sed 's/=.*//'g | tr '\n' '|')')\=')

test:
    echo $$FOO

Para executar

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo
    
por 01.06.2016 / 16:40
3

Aqui está uma solução elegante que não importa Make vars, mas define quaisquer exportações de ambiente para subprocessos de shell. Pessoalmente, prefiro manter meus perfis dinâmicos em scripts.

export BASH_ENV=tools/sh/env.sh

Existem algumas dicas. Infelizmente ENV não funciona, acho que deveria (mas isso é um problema com o Bash, não com o Make). Também requer outra linha, porque o interpretador de shell padrão do Make é / bin / sh.

BASH_ENV := tools/sh/env.sh SHELL := /usr/bin/bash

No lado de cima, isso também permite incluir funções do shell em scripts do Makefile, mas apenas para os scripts de receita. Eu não sei como outras conchas além de Bash são. E há um pouco mais acontecendo. Eu coloquei um testfile como GIST .

Existem muitos scripts de shell complicados imagináveis. Eu gosto deste Q / A melhor para as respostas simples.

    
por 07.04.2018 / 02:18
2

se o seu nome de arquivo for .makerc , então você pode incluí-lo no Makefile tão simples assim:

include .makerc

Eu prefiro adicionar o sinal - antes de include , para suprimir quaisquer avisos.

    
por 02.09.2016 / 03:14