Makefile inclui arquivo env

26

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

FOO=bar
BAZ=quux

Observe que não há direcionamento exportpara cada env var. Se eu adicionar o arquivo principal exporte apenas includeo env no Makefile, tudo funcionará como deveria. Mas preciso manter os ambientes sem liderança export. Isso me impede de usar apenas include envfileno Makefile.

Eu também tentei fazer algo assim:

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

Mas fazer isso causa um erro, porque o arquivo env não existe para inclusão.

Michael Irwin
fonte
11
Bem-vindo ao Unix e Linux. Por favor, indique a pergunta que você tem claramente. O que é exatamente isso que você está tentando realizar?
darnir
11
Estou tentando incluir um arquivo que contém pares de variáveis ​​de ambiente em um Makefile para que eles estejam disponíveis para o ambiente em que o make está sendo executado.
Michael Irwin

Respostas:

40

Se você estiver usando o gnu make, o que deve funcionar é incluir o envfilearquivo e exportar a lista de vars obtidos do mesmo arquivo:

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

test:
        env
meuh
fonte
7
Obrigado por esta resposta, é brilhante! Embora minha versão funcione sem a export $(shell...linha. Eu só preciso da includelinha.
DuffJ
32

Eu tive um problema semelhante e aterrei nesse segmento. Outra solução possível é apenas executar o comando make export sem argumentos:

include .env
export

Isso exportará todas as variáveis ​​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 assistente de script de shell.

Brock
fonte
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 correr

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo
theliberalsurfer
fonte
3

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

export BASH_ENV=tools/sh/env.sh

Existem algumas dicas. Infelizmente, o ENV não funciona, acho que deveria (mas esse é um problema do Bash, não do Make). Também requer realmente 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 superior, isso também permite incluir funções de shell nos scripts Makefile, mas apenas nos scripts de receita. Eu não sei como outras conchas além de Bash se saem. E há um pouco mais acontecendo. Eu coloquei alguns arquivos de teste como GIST .

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

mpe
fonte
2

se seu nome de arquivo for .makerc, você poderá incluí-lo no Makefile de maneira simples:

include .makerc

Prefiro adicionar -sinal antes include, para suprimir todos os avisos.

holms
fonte