Makefile env dosyasını içerir


26

Bir Makefile içine bazı env değişkenleri eklemeye çalışıyorum. Env dosyası şuna benzer:

FOO=bar
BAZ=quux

exportHer env için bir yol olmadığını not edin . Makefile'e öncü exportve sadece includeenv dosyasını eklersem, her şey olması gerektiği gibi çalışır. Ama env Varans'ı lider tutmam gerekiyor export. Bu sadece include envfileMakefile'da kullanmamı engelliyor .

Ayrıca böyle bir şey yapmayı da denedim:

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

Ancak bu nedeni yapmak, env dosyasını dahil etmek için bulunmadığından, hata atmaya neden olur.


1
Unix ve Linux'a hoş geldiniz. Lütfen sorunuzu net bir şekilde belirtin. Tam olarak başarmaya çalıştığınız şey nedir?
lanet olası

1
Bir Makefile içine ortam değişken çiftleri içeren bir dosyayı dahil etmeye çalışıyorum, böylece yapımın çalıştığı ortamda kullanılabilir.
Michael Irwin

Yanıtlar:


40

Eğer gnu make kullanıyorsanız, çalışması gereken şey envfiledosyayı eklemektir , sonra aynı dosyadan gelen vars listesini verin:

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

test:
        env

7
Bu cevap için teşekkürler, mükemmel! Benim sürümüm bile export $(shell...çizgi olmadan çalışıyor . Sadece includeçizgiye ihtiyacım var .
DuffJ

32

Benzer bir sorun yaşadım ve bu konuya başladım. Başka bir olası çözüm ise make export komutunu herhangi bir tartışma olmadan yapmaktır:

include .env
export

Bu, tüm make değişkenlerini ortam değişkenleri olarak dışa aktarır. Bu davranış tüm kullanım durumlarıyla eşleşebilir veya eşleşmeyebilir, ancak benim için çalıştı ve herhangi bir kabuk komut dosyası sihirbazı içermiyordu.


3

Önceden varolan ENV değişkenlerini korur

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

test:
    echo $$FOO

Koşmak

make ENVFILE=envfile test # bar

export FOO=foo
make ENVFILE=envfile test # foo

3

İşte Make vars'ı almayan, ancak kabuk alt işlemleri için herhangi bir çevre ihracatı belirleyen zarif bir çözüm. Şahsen profillerimi dinamik komut dosyaları olarak tutmayı tercih ederim.

export BASH_ENV=tools/sh/env.sh

Bazı yakalamalar var. Ne yazık ki ENV işe yaramıyor, bence çalışması gerekiyor (ama bu Bash ile değil, sorunlu). Ayrıca, gerçekten başka bir satır gerektirir, çünkü Make'ın varsayılan kabuk tercümanı / bin / sh'dir.

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

Yukarı tarafta bu aynı zamanda Makefile betiklerine kabuk fonksiyonlarının dahil edilmesine izin verir, ancak sadece tarif betikleri için. Bash maşası dışında diğer mermilerin nasıl olduğunu bilmiyorum. Ve biraz daha oluyor. GIST olarak bir test dosyası hazırladım .

Hayal edebileceğiniz çok sayıda karmaşık kabuk komut dosyası var. Bu soruları basit cevaplar için en iyi şekilde seviyorum.


2

Eğer dosya adınız .makercöyleyse, bunu Makefile'e bu kadar basit bir şekilde ekleyebilirsiniz:

include .makerc

Uyarıları bastırmak için daha -önce işaret eklemeyi tercih ederim include.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.