Makefile включає env-файл


26

Я намагаюся включити декілька екологів у Makefile. Файл env виглядає так:

FOO=bar
BAZ=quux

Зауважте, що немає жодного ведучого exportдо кожного варіанту env. Якщо я додам провідний exportі просто includeenv-файл у Makefile, все працює як слід. Але мені потрібно тримати лідери env vars sans export. Це заважає мені просто використовувати include envfileв Makefile.

Я також спробував зробити щось подібне:

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

Але це робить причиною помилки, тому що env-файл не існує для включення.


1
Ласкаво просимо до Unix & Linux. Будь ласка, викладіть чітко це питання. Що саме ви намагаєтеся досягти?
darnir

1
Я намагаюся включити файл, який містить пари змінних оточуючих, у Makefile, щоб вони були доступні для середовища, в якому працює.
Майкл Ірвін

Відповіді:


40

Якщо ви використовуєте gnu make, то, що має працювати, це включити envfileфайл, а потім експортуйте список vars, отриманий із того самого файлу:

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

test:
        env

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

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, щоб придушити будь-які попередження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.