Makefile включает файл env

26

Я пытаюсь включить некоторые env vars в Makefile. Файл env выглядит так:

FOO=bar
BAZ=quux

Обратите внимание, что нет никаких ведущих exportк каждому env var. Если я добавлю ведущий exportи просто includeфайл env в Makefile, все будет работать как надо. Но мне нужно, чтобы env vars sans лидировал export. Это мешает мне просто использовать include envfileв Makefile.

Я также попытался сделать что-то вроде этого:

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

Но, делая это, команда make выдает ошибку, потому что файл env не предназначен для включения.

Майкл Ирвин
источник
1
Добро пожаловать в Unix и Linux. Пожалуйста, сформулируйте свой вопрос четко. Что именно вы пытаетесь достичь?
Дарнир
1
Я пытаюсь включить файл, содержащий пары переменных среды, в Makefile, чтобы они были доступны для среды, в которой работает make.
Майкл Ирвин

Ответы:

40

Если вы используете gnu make, нужно включить envfileфайл, а затем экспортировать список переменных, полученных из этого файла:

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

test:
        env
meuh
источник
7
Спасибо за этот ответ, это блестяще! Хотя моя версия даже работает без export $(shell...линии. Мне просто нужна includeлиния.
DuffJ
32

У меня была похожая проблема и я приземлился в этой теме. Другое возможное решение - просто выполнить команду make export без каких-либо аргументов:

include .env
export

Это будет экспортировать все переменные make как переменные окружения. Такое поведение может соответствовать или не соответствовать всем случаям использования, но оно работало для меня и не включало никаких сценариев сценариев оболочки.

барсук
источник
3

Сохраняет предварительно существующие вариации ENV

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

test:
    echo $$FOO

Бежать

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo
theliberalsurfer
источник
3

Вот элегантное решение, которое не импортирует Make vars, но устанавливает любые экспорты среды для подпроцессов оболочки. Лично я предпочитаю сохранять в своих профилях динамические скрипты.

export BASH_ENV=tools/sh/env.sh

Есть некоторые ошибки. К сожалению, ENV не работает, я думаю, что должно (но это проблема с Bash, а не с Make). Также это действительно требует другой строки, потому что интерпретатором оболочки по умолчанию для Make является / bin / sh.

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

С другой стороны, это также позволяет включать функции оболочки в сценарии Makefile, но только для сценариев рецепта. Я не знаю, как другие снаряды, кроме платы за проезд Баш. И там происходит немного больше. Я поместил тестовый файл в GIST .

Существует множество сложных сценариев оболочки. Мне нравится этот Q / A лучше всего для простых ответов.

ПДВ
источник
2

если ваше имя файла, .makercто вы можете включить его в Makefile так просто:

include .makerc

Я предпочитаю добавлять -знак раньше include, чтобы подавить любые предупреждения.

Holms
источник