1

Я хочу, чтобы в make было несколько списков одинакового размера, один из которых содержит имена файлов, а другие - информацию, связанную с этими файлами, в том же порядке. Я хочу иметь возможность передавать определенную информацию для файла в программу, которая создает этот файл. Например, если X - это список имен файлов (скажем, совпадающий% в приведенном ниже правиле), а Y и Z - информация об этих файлах, я бы хотел иметь такое правило:

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

где $(*) - переменная make, равная той части имени файла, которая соответствует%. Конечно, переменные в make не могут быть проиндексированы с помощью [].

1 ответ1

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)) $< $@ 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .