Makefile包含环境文件


26

我正在尝试在Makefile中包含一些环境变量。env文件如下所示:

FOO=bar
BAZ=quux

注意没有导致export每个环境变量。如果我在Makefile中添加前导文件export和仅includeenv文件,那么一切都会正常进行。但是我需要保持环境无人值守export。这使我无法仅include envfile在Makefile中使用。

我也尝试过这样做:

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

但是这样做会使make引发错误,因为没有包含env文件。


1
欢迎使用Unix&Linux。请清楚说明您的问题。您要完成的任务到底是什么?
darnir

1
我正在尝试在Makefile中包含一个包含环境变量对的文件,以便它们在运行make的环境中可用。
迈克尔·欧文

Answers:


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变量导出为环境变量。此行为可能匹配或不能匹配所有用例,但是它对我有用,并且不涉及任何Shell脚本向导。


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,而是为shell子进程设置任何环境导出。就个人而言,我更喜欢保持个人资料动态脚本。

export BASH_ENV=tools/sh/env.sh

有一些陷阱。不幸的是,ENV不起作用,我认为应该起作用(但这是Bash的问题,而不是Make的问题)。而且它确实需要另一行,因为Make的默认外壳解释器是/ bin / sh。

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

从好的方面来说,这还允许在Makefile脚本中包括外壳函数,但仅适用于配方脚本。我不知道除了Bash票价外的其他炮弹。还有更多的事情要做。我将一些测试文件设置为GIST

有很多可以想象的复杂的shell脚本。对于简单的答案,我最喜欢此Q / A。


2

如果您的文件名是,.makerc那么您可以像这样简单地将其包含在Makefile中:

include .makerc

我更喜欢在-之前添加符号include,以禁止显示任何警告。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.