Makefile มีไฟล์ env


26

ฉันกำลังพยายามรวม env vars ไว้ใน Makefile ไฟล์ env ดูเหมือนว่า:

FOO=bar
BAZ=quux

โปรดทราบว่าไม่มีการนำexportไปสู่แต่ละ env var หากฉันเพิ่มไฟล์นำหน้าexportและเป็นเพียงincludeไฟล์ env ใน Makefile ทุกอย่างทำงานได้ตามที่ควรจะเป็น แต่ผมจำเป็นต้องให้การ env vars exportซันส์ชั้นนำ ที่ป้องกันไม่ให้ฉันเพียงแค่ใช้include envfileใน Makefile

ฉันได้ลองทำบางสิ่งเช่นนี้:

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

แต่การทำเช่นนั้นทำให้เกิดข้อผิดพลาดเนื่องจากไฟล์ env ไม่ได้มีไว้สำหรับรวมถึง


1
ยินดีต้อนรับสู่ Unix & Linux โปรดระบุคำถามที่คุณชัดเจน อะไรคือสิ่งที่คุณกำลังพยายามทำให้สำเร็จ
darnir

1
ฉันกำลังพยายามรวมไฟล์ที่มีคู่ตัวแปรสภาพแวดล้อมไว้ใน Makefile เพื่อให้สามารถใช้งานได้กับสภาพแวดล้อมที่ make กำลังทำงานอยู่
Michael Irwin

คำตอบ:


40

หากคุณใช้ gnu make สิ่งที่ควรใช้คือรวมenvfileไฟล์แล้วส่งออกรายการ vars ที่ได้จากไฟล์เดียวกัน:

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

test:
        env

7
ขอบคุณสำหรับคำตอบนี้มันยอดเยี่ยม! แม้ว่ารุ่นของฉันจะใช้งานได้แม้ไม่มีexport $(shell...บรรทัด ฉันแค่ต้องการincludeเส้น
DuffJ

32

ฉันมีปัญหาที่คล้ายกันและลงจอดบนเธรดนี้ อีกวิธีที่เป็นไปได้คือการทำคำสั่งส่งออกโดยไม่มีข้อโต้แย้งใด ๆ :

include .env
export

สิ่งนี้จะส่งออกตัวแปรทำให้เป็นตัวแปรสภาพแวดล้อมทั้งหมด พฤติกรรมนี้อาจจะใช่หรือไม่ใช่ตรงกับทุกกรณีการใช้งาน แต่มันก็ใช้ได้กับฉันและไม่ได้มีส่วนเกี่ยวข้องกับตัวช่วยสร้างการเขียนสคริปต์เชลล์


3

เก็บไว้ก่อน vars 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

มี gotchas บ้าง น่าเสียดายที่ ENV ใช้งานไม่ได้ฉันคิดว่าควร (แต่นั่นเป็นปัญหากับ Bash ไม่ใช่ Make) อีกทั้งยังต้องการบรรทัดอื่นเนื่องจากตัวแปลเชลล์เริ่มต้นของ Make คือ / bin / sh

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

ด้านบนนี้ยังอนุญาตให้รวมฟังก์ชั่นเชลล์ในสคริปต์ Makefile แต่สำหรับสคริปต์สูตรเท่านั้น ฉันไม่รู้ว่ากระสุนอื่นนอกเหนือจาก Bash fare อย่างไร และยังมีอีกเล็กน้อยที่เกิดขึ้น ฉันวางไฟล์ทดสอบไว้เป็นส่วนสำคัญ

มีสคริปต์เชลล์ที่ซับซ้อนมากมายเท่าที่จะจินตนาการได้ ฉันชอบคำถามนี้ / คำตอบที่ดีที่สุด


2

ถ้าชื่อไฟล์ของคุณเป็นไฟล์.makercคุณสามารถใส่มันไว้ใน Makefile ง่ายๆเช่นนี้:

include .makerc

ฉันต้องการที่จะเพิ่ม-สัญญาณก่อนหน้าincludeนี้เพื่อระงับคำเตือนใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.