Makefile menyertakan file env

26

Saya mencoba memasukkan beberapa env vars ke dalam Makefile. File env terlihat seperti:

FOO=bar
BAZ=quux

Perhatikan tidak ada petunjuk exportuntuk setiap env var. Jika saya menambahkan yang memimpin exportdan hanya includefile env di Makefile, semuanya berfungsi sebagaimana mestinya. Tapi aku harus tetap memimpin export. Itu mencegah saya dari hanya menggunakan include envfiledi Makefile.

Saya juga mencoba melakukan sesuatu seperti ini:

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

Tetapi melakukan hal itu menyebabkan membuat kesalahan karena file env tidak ada untuk disertakan.

Michael Irwin
sumber
1
Selamat datang di Unix & Linux. Harap sebutkan pertanyaan yang Anda miliki dengan jelas. Apa sebenarnya yang ingin Anda capai?
darnir
1
Saya mencoba untuk memasukkan file yang berisi pasangan variabel lingkungan ke dalam Makefile sehingga tersedia untuk lingkungan di mana make sedang berjalan.
Michael Irwin

Jawaban:

40

Jika Anda menggunakan gnu make, apa yang harus bekerja adalah memasukkan envfilefile, lalu ekspor daftar vars yang didapat dari file yang sama:

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

test:
        env
meuh
sumber
7
Terima kasih atas jawaban ini, sangat brilian! Meskipun versi saya bahkan berfungsi tanpa export $(shell...garis. Saya hanya perlu includegaris.
DuffJ
32

Saya punya masalah serupa dan mendarat di utas ini. Solusi lain yang mungkin adalah dengan hanya melakukan perintah ekspor tanpa argumen:

include .env
export

Ini akan mengekspor semua variabel make sebagai variabel lingkungan. Perilaku ini mungkin cocok atau tidak cocok dengan semua kasus penggunaan, tapi itu berhasil untuk saya dan tidak melibatkan sihir skrip shell.

Bangsat
sumber
3

Mempertahankan vars ENV yang sudah ada sebelumnya

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

test:
    echo $$FOO

Untuk berlari

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo
thaliberalsurfer
sumber
3

Berikut ini adalah solusi elegan yang tidak mengimpor Make vars, tetapi tidak menetapkan ekspor lingkungan untuk subproses shell. Secara pribadi saya lebih suka menjaga skrip dinamis profil saya.

export BASH_ENV=tools/sh/env.sh

Ada beberapa gotcha. Sayangnya ENV tidak berfungsi, saya pikir seharusnya (tapi itu masalah dengan Bash, bukan Make). Itu juga benar-benar membutuhkan baris lain, karena shell default dari interpreter adalah / bin / sh.

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

Di sisi atas ini juga memungkinkan untuk memasukkan fungsi shell dalam skrip Makefile, tetapi hanya untuk skrip resep. Saya tidak tahu bagaimana cangkang lain selain Bash ongkos. Dan ada sedikit lebih banyak hal yang terjadi. Saya menaruh beberapa testfile sebagai GIST .

Ada banyak skrip shell rumit yang bisa dibayangkan. Saya suka Tanya Jawab ini terbaik untuk jawaban sederhana.

mpe
sumber
2

jika nama file .makercAnda maka Anda dapat memasukkannya ke Makefile sesederhana ini:

include .makerc

Saya lebih suka menambahkan -tanda sebelumnya include, untuk menekan peringatan.

holms
sumber