2010-10-05 15 views
13

मैं एक अस्थायी निर्देशिका कि इस बिल्ड के लिए अद्वितीय हो जाएगा उपयोग करना चाहते हैं। मेकफ़ाइल में मैं अपने मेक कमांड का पिड कैसे प्राप्त कर सकता हूं?मेकफ़ाइल में मेरे मेक कमांड का पिड कैसे प्राप्त करें?

मैंने कोशिश की:

TEMPDIR = /tmp/myprog.$$$$ 

लेकिन इस TEMPDIR/tmp/myprog.$$ के रूप में और उसके बाद हर आदेश जो इस refs के लिए एक नया पीआईडी ​​के रूप में eval स्टोर करने के लिए लगता है! मैं उन सभी के लिए एक पिड कैसे प्राप्त करूं (मैं मेक पिड पसंद करूंगा, लेकिन कुछ अद्वितीय होगा)।

अग्रिम धन्यवाद।

+1

मूल प्रश्न: कैसे Makefile में प्रक्रिया आईडी प्राप्त करने के लिए। अगर कोई जानता है, तो मुझे एक जवाब पसंद आएगा। हालांकि, इसने मेरी मूल समस्या को हल किया। – sligocki

उत्तर

25

अद्वितीय अस्थायी फ़ाइल नाम बनाने के लिए mktemp की कोशिश करो। -d विकल्प फ़ाइल के बजाय एक निर्देशिका बनाएगा।

TEMPFILE := $(shell mktemp) 
TEMPDIR := $(shell mktemp -d) 

कोलन नोट करें। (संपादक का नोट: यह कारणों को एक बार फ़ंक्शन का मूल्यांकन करने और $ (TEMPDIR) के प्रत्येक संदर्भ के लिए अभिव्यक्ति का पुनर्मूल्यांकन करने के बजाय अपना मान निर्दिष्ट करने का कारण बनता है।)

+0

धन्यवाद, यह एक अच्छा विकल्प की तरह दिखता है। मैं मेकफ़ाइल सिंटैक्स के लिए नया हूं, मैं एक शेल कमांड (mktemp) का उपयोग कर एक चर (TEMPDIR) को कैसे परिभाषित कर सकता हूं? – sligocki

+2

टेम्पर्ड: = $ (खोल mktemp)। कोलन नोट करें। –

+0

यह सवाल का जवाब नहीं देता है। – badzil

1

आप दिनांक स्ट्रिंग का उपयोग कर सकते हैं। जब तक आप एक ही समय में कई बिल्डों को लात मार नहीं रहे हैं, यह बहुत करीब होना चाहिए।

कुछ निम्नलिखित

pid_standin := $(shell date +%Y-%m-%d_%H-%M-%S) 

file: 
    echo $(pid_standin) 

$ Make 
2010-10-04_21-01-58 

अद्यतन की तरह: जैसा कि टिप्पणी में उल्लेख किया है, तो आप नाम के साथ एक चर सेट = वैल वाक्यविन्यास यह re-evaluated each time it's used है। : = वाक्यविन्यास इसे सेट करता है और मान का पुनर्मूल्यांकन नहीं करता है, हालांकि बैक-टिक्स का उपयोग करना किसी भी तरह से मिलता है। आप वास्तव में इस तरह की चीजों के लिए $ (खोल सीएमडी) निर्माण का उपयोग करना चाहते हैं।

+0

यह काम नहीं करता है। यह अभी भी 'तारीख ... 'हर बार जब आप $ (pid_standin) का उपयोग करते हैं और इस प्रकार विभिन्न निर्देशिकाएं तैयार करेंगे। – sligocki

+1

दिखाता है कि जब मैं एक साधारण परीक्षण केस का प्रयास करता हूं, तो एक फिक्स के साथ प्रश्न अपडेट किया जाता है –

6

make प्रत्येक आदेश में यह शुरू होता है के लिए एक नया खोल शुरू होता है। बैश (अन्य गोले के लिए जांच नहीं की) echo $PPID माता पिता प्रक्रिया ID (जो करना है) देता है का उपयोग करना।

all: subtarget 
     echo $$PPID 
     echo $(shell echo $$PPID) 

subtarget: 
     echo $$PPID 
10
TEMPDIR := $(shell mktemp) 

समस्या है: हर बार जब आप चलाने के बनाने के लिए, यह एक अस्थायी फ़ाइल पैदा करेगा। भले ही आप इसका उपयोग करते हैं या नहीं, भले ही आपके द्वारा उपयोग किए जाने वाले लक्ष्य लक्ष्य के बावजूद। इसका अर्थ है: या तो आप इस फ़ाइल को हर लक्ष्य में हटाते हैं या आप उन्हें कभी भी हटा नहीं पाएंगे।

मैं -u पैरामीटर जोड़ना पसंद:

TEMPDIR := $(shell mktemp -u) 

यह फ़ाइल बनाने के बिना एक अद्वितीय फ़ाइल नाम बनाने के लिए mktemp बनाता है। अब आप उन लक्ष्यों में फ़ाइल बना सकते हैं जिनकी आपको आवश्यकता है। निस्संदेह दौड़ की स्थिति का एक मौका है, जहां फ़ाइल बनाने से पहले किसी अन्य प्रक्रिया द्वारा फ़ाइल का उपयोग किया जाता है। यही कारण है कि बहुत संभावना नहीं है, लेकिन एक ऊंचा कमान में इसका इस्तेमाल नहींmake install की तरह, है।

1

यहाँ अपने प्रश्न है, जो कोई भी आप देना चाहते हैं लग रहा था करने के लिए जवाब है:

TEMPDIR := /tmp/myprog.$(shell echo $$$$) 
बेशक

, इस अद्वितीय होने की गारंटी नहीं है।

संबंधित मुद्दे