Makefile: создание правил из списка шаблонов

В моем каталоге есть много именованных файлов
A. xxx A01.xxx A02.xxx A03.ХХХ
B. xxx B01.ХХХ

Z……

Я хотел бы создать правила, такие как

A.yyy : A.xxx
      command type 1

A01.yyy : A01.xxx A.xxx
      command type 2

B.yyy : B.xxx
      command type 1
B01.yyy : B01.xxx B.xxx
      command type 2

Z01.yyy: Z01.xxx
      command type 3

Кто-нибудь может мне подсказать ?

Я попробовал что-то вроде этого (это кажется нормальным для команды 1 в 3, но в команде 2 я не вижу, как поставить второй переэквисит)

list:= A B 
source=$(wildcard *.xxx)
compi:=$(patsubst %.xxx, %.yyy, $(source))
list_pattern=$(addsuffix %, $(list))
list_yyy=$(addsuffix .yyy, $(list))
list_nb_yyy=$(filter $(list_pattern), $(compi))

%.yyy:%xxx
      @echo $@ - $+ -  command 3

all: $(compi)

.SECONDEXPANSION:
$(list_yyy):  $$(patsubst %.yyy, %.xxx, $$@)
     @echo $@ - $+ - command 1
$(list_nb_yyy):  $$(patsubst %.yyy, %.xxx, $$@)
     @echp $@ - $+ - command 2 

1 ответ

  1. Две важные части документации, которые вы должны прочитать включают:

    Функция eval очень специфична: она позволяет определять новые конструкции makefile, которые не являются постоянными; которые являются результатом оценки других переменных и функций. Аргумент функции eval расширяется, затем результаты этого расширения анализируются как синтаксис makefile. Расширенные результаты могут определять новые переменные make, цели, неявные или явные правила и т. д.

    Возможно, что этим критериям будет соответствовать несколько правил шаблона. В этом случае make выберет правило с самым коротким стержнем (то есть шаблон, который наиболее точно соответствует). Если несколько правил шаблона имеют самый короткий стержень, make выберет первый найденный в файле makefile.

    Самое короткое правило стержня сделает его трудным иметь 3 различных правила картины ДляA.yyy, A01.yyyи Z01.yyyсоответственно. Однако с помощью функции eval можно использовать информацию, имеющуюся в listпеременной, для создания не шаблонных правил для A.yyyand B.yyyи корректных правил шаблона для других целевых объектов (при условии, что решение принимается на префиксе имени):

    list:= A B
    source=$(wildcard *.xxx)
    compi:=$(patsubst %.xxx, %.yyy, $(source))
    
    all: $(compi)
    
    define LIST_RULE
    $(1).yyy: $(1).xxx
        @echo $$@ - $$+ - command 1
    $(1)%.yyy: $(1)%.xxx $(1).xxx
        @echo $$@ - $$+ - command 2
    endef
    $(foreach l,$(list),$(eval $(call LIST_RULE,$(l))))
    
    %.yyy: %.xxx
        @echo $@ - $+ -  command 3
    

    Обратите внимание, что резервное решение ( command 3) не будет выбрано для A01.yyyи B01.yyyпотому, что правило шаблона в LIST_RULEшаблоне приводит к более короткому стержню (01вместо A01или B01)