आप GNU मेक इन लिस्ट के किसी शब्द का इंडेक्स कैसे पा सकते हैं?


1

मैं बनाने के लिए कई सूचियों में सक्षम होना चाहता हूं, सभी समान आकार, जिनमें से एक में फ़ाइलनाम और दूसरे में उन फ़ाइलों से संबंधित जानकारी शामिल है, उसी क्रम में। मैं एक फ़ाइल के लिए एक फ़ाइल के लिए विशिष्ट जानकारी को पारित करने में सक्षम होना चाहता हूं जो उस फ़ाइल को बनाता है। उदाहरण के लिए, यदि X फाइलनाम की सूची है (नीचे नियम में% मिलान कहते हैं) और Y और Z उन फ़ाइलों के बारे में जानकारी है, तो मैं इस तरह का नियम बनाने में सक्षम होना चाहूंगा:

%.a: %.b:
    myprogram $(Y[$(*)]) $(Z[$(*)]) $< $@

जहाँ $ (*)% द्वारा मेल किए गए फ़ाइल नाम के भाग के बराबर परिवर्तनशील है। बेशक, चर में [] के साथ अनुक्रमित नहीं किया जा सकता है।

जवाबों:


0

मुझे इसका हल मिल गया। केवल कमी वास्तव में यह है कि इसमें एक विशेष चरित्र के चयन की आवश्यकता होती है जो सूची में मौजूद नहीं है।

EMPTY :=
SPACE := $(EMPTY) $(EMPTY)

# Pick a non-space character that NEVER appears in any word in $S.  Here we use a comma.
XX := ,

S := This is very funny world and YOU is the funniest of all!
FIND := YOU
$(info Find $(FIND) in $(S))

S := $(XX)$(subst $(SPACE),$(XX),$(S))$(XX)
$(info S is $(S))
S := $(subst $(XX)$(FIND)$(XX),$(XX)$(FIND)$(SPACE),$(S))
$(info S is $(S))
S := $(firstword $(S))
$(info S is $(S))
S := $(subst $(XX),$(SPACE),$(S))
$(info S is $(S))
IDX = $(words $(S))
$(info IDX of $(FIND) is $(IDX))

# Combine into a giant function that can be called.
IDX = $(words $(subst $(XX),$(SPACE),$(firstword $(subst $(XX)$(2)$(XX),$(XX)$(2)$(SPACE),$(XX)$(subst $(SPACE),$(XX),$(1))$(XX)))))
$(info Index of $(FIND) is $(call IDX,$(S),$(FIND)))

# Define a function that returns the list element of the first argument that
# is at the same position as the second argument is in the third argument.
ATIDX = $(word $(call IDX,$3,$2),$1)

तो नियम ऐसा दिखेगा:

%.a: %.b
    myprogram $(call, ATIDX,$(Y),$(*),$(X)) $(call ATIDX,$(Z),$(*),$(X)) $< $@ 

साझा करने के लिए धन्यवाद। हालांकि, यह 100% सही काम नहीं करता है। $(warning test $(call IDX,aaa bbb ccc ddd,eee))और $(warning test $(call IDX,aaa bbb ccc ddd,ddd))दोनों लौटते हैं। मैं थोड़ा बेहतर संस्करण प्रदान कर सकता हूं जो शब्द नहीं होने पर 5 (सूचकांक से बाहर) देता है:IDX = $(words $(subst $(XX),$(SPACE),$(firstword $(subst $(XX)$(2)$(XX),$(SPACE)$(2)$(SPACE),$(XX)IDX***DUMMY$(XX)$(subst $(SPACE),$(XX),$(1))$(XX)))))
कूगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.