Makefile bao gồm tệp env


26

Tôi đang cố gắng đưa một số lọ env vào Makefile. Tệp env trông như:

FOO=bar
BAZ=quux

Lưu ý không có dẫn exportđến mỗi var env. Nếu tôi thêm tệp hàng đầu exportvà chỉ includetệp env trong Makefile, mọi thứ sẽ hoạt động như bình thường. Nhưng tôi cần phải giữ enans vars sans hàng đầu export. Điều đó ngăn tôi chỉ sử dụng include envfiletrong Makefile.

Tôi cũng đã thử làm một cái gì đó như thế này:

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

Nhưng việc đó khiến cho việc đưa ra lỗi là do tệp env không có trong đó.


1
Chào mừng bạn đến với Unix & Linux. Hãy nêu câu hỏi bạn có rõ ràng. Chính xác thì bạn đang cố gắng đạt được điều gì?
darnir

1
Tôi đang cố gắng đưa một tệp chứa các cặp biến môi trường vào một Makefile để chúng có sẵn cho môi trường mà nó đang chạy.
Michael Irwin

Câu trả lời:


40

Nếu bạn đang sử dụng gnu make, công việc nên làm là bao gồm envfiletệp, sau đó xuất danh sách các vars nhận được từ cùng một tệp:

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

test:
        env

7
Cảm ơn câu trả lời này, thật tuyệt vời! Mặc dù phiên bản của tôi thậm chí hoạt động mà không có export $(shell...dòng. Tôi chỉ cần includedòng.
DuffJ

32

Tôi đã có một vấn đề tương tự và hạ cánh trên chủ đề này. Một giải pháp khả thi khác là chỉ thực hiện lệnh make mà không có bất kỳ đối số nào:

include .env
export

Điều này sẽ xuất tất cả các biến làm biến môi trường. Hành vi này có thể phù hợp hoặc không phù hợp với tất cả các trường hợp sử dụng, nhưng nó hoạt động với tôi và không liên quan đến bất kỳ thuật sĩ kịch bản shell nào.


3

Bảo quản bình ENV hiện có trước

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

test:
    echo $$FOO

Chạy

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo

3

Đây là một giải pháp tao nhã không nhập Make vars, nhưng không đặt bất kỳ xuất môi trường nào cho các quy trình con shell. Cá nhân tôi thích giữ hồ sơ của tôi kịch bản động.

export BASH_ENV=tools/sh/env.sh

Có một số vấn đề. Thật không may, ENV không hoạt động, tôi nghĩ nó nên (nhưng đó là một vấn đề với Bash, không phải Make). Ngoài ra, nó thực sự đòi hỏi một dòng khác, bởi vì trình thông dịch shell mặc định của Make là / bin / sh.

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

Về mặt này, điều này cũng cho phép bao gồm các hàm shell trong các tập lệnh Makefile, nhưng chỉ cho các tập lệnh công thức. Tôi không biết làm thế nào các vỏ khác ngoài giá vé Bash. Và có một chút nữa đang diễn ra.Tôi đặt một số testfile lên như GIST .

Có rất nhiều kịch bản shell phức tạp có thể tưởng tượng. Tôi thích Q / A này tốt nhất cho các câu trả lời đơn giản.


2

nếu tên tệp của bạn là .makercthì bạn có thể đưa nó vào Makefile đơn giản như sau:

include .makerc

Tôi thích thêm -dấu hiệu trước include, để ngăn chặn bất kỳ cảnh báo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.