Makefile incluye archivo env

26

Estoy tratando de incluir algunos entornos en un Makefile. El archivo env se ve así:

FOO=bar
BAZ=quux

Tenga en cuenta que no hay derivación exporta cada env var. Si agrego el archivo principal exporty solo includeel archivo env en el Makefile, todo funciona como debería. Pero necesito mantener el ambiente sin liderazgo export. Eso me impide usarlo solo include envfileen el Makefile.

También he intentado hacer algo como esto:

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

Pero hacer eso causa que arroje un error porque el archivo env no está ahí para incluirlo.

Michael Irwin
fuente
1
Bienvenido a Unix y Linux. Indique claramente la pregunta que tiene. ¿Qué es exactamente lo que estás tratando de lograr?
darnir
1
Estoy tratando de incluir un archivo que contenga pares de variables de entorno en un Makefile para que estén disponibles para el entorno en el que se ejecuta make.
Michael Irwin

Respuestas:

40

Si está utilizando gnu make, lo que debería funcionar es incluir el envfilearchivo, luego exportar la lista de variables obtenidas del mismo archivo:

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

test:
        env
meuh
fuente
77
Gracias por esta respuesta, es genial! Aunque mi versión incluso funciona sin la export $(shell...línea. Solo necesito la includelínea.
DuffJ
32

Tuve un problema similar y llegué a este hilo. Otra posible solución es simplemente hacer el comando make export sin ningún argumento:

include .env
export

Esto exportará todas las variables make como variables de entorno. Este comportamiento puede o no coincidir con todos los casos de uso, pero funcionó para mí y no involucró ninguna magia de scripting de shell.

Brock
fuente
3

Conserva los vars ENV preexistentes

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

test:
    echo $$FOO

Correr

make ENVFILE=envfile test # bar

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

Aquí hay una solución elegante que no importa Make vars, pero establece exportaciones de entorno para subprocesos de shell. Personalmente prefiero mantener mis scripts dinámicos de perfiles.

export BASH_ENV=tools/sh/env.sh

Hay algunas trampas. Lamentablemente, ENV no funciona, creo que debería (pero eso es un problema con Bash, no Make). Además, realmente requiere otra línea, porque el intérprete de shell predeterminado de Make es / bin / sh.

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

En el lado positivo, esto también permite incluir funciones de shell en los scripts de Makefile, pero solo para los scripts de recetas. No sé cómo les va a otros proyectiles además de Bash. Y hay un poco más en juego. Puse un archivo de prueba como GIST .

Hay muchos scripts de shell complicados imaginables. Me gusta este Q / A mejor para las respuestas simples.

mpe
fuente
2

si su nombre de archivo es, .makercentonces puede incluirlo en Makefile tan simple como esto:

include .makerc

Prefiero agregar un -signo antes include, para suprimir cualquier advertencia.

holms
fuente