GNU Make: использование подстановочной функции с неявными правилами - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть структура проекта, которая выглядит примерно так:

.
└── src
    ├── Module1
    │   ├── source1.cc
    │   ├── source2.cc
    │   └── source3.cc
    ├── Module2
    │   ├── source1.cc
    │   ├── source2.cc
    │   └── source3.cc
    └── Module3
        ├── source1.cc
        ├── source2.cc
        └── source3.cc

У меня есть неявное правило, которое создает объектный файл для каждого исходного файла и поддерживает структуру каталогов (например, src/Module1/source2.cc будет скомпилировать в obj/Module1/source2.o).

Однако теперь я хотел бы иметь неявное правило для создания архивных файлов для каждого модуля. Например, каждый объектный файл, скомпилированный из src/Module2, будет добавлен в obj/Module2.a. Моя первая идея выглядела очень похоже на мое неявное правило для объектных файлов:

obj/%.a: $(wildcard obj/%/*.o)
    @mkdir -p $(@D);
    ar -crs "$@" $^;

Это отразило бы работу по компиляции объектных файлов с другим неявным правилом. Однако проблема заключается в том, что символ % не раскрывается.

Есть ли способ получить доступ к % из неявного правила при вызове функции подстановочного знака?

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете сделать это с помощью Вторичного расширения :

.SECONDEXPANSION:
obj/%.a: $$(wildcard obj/%/*.o)
    @mkdir -p $(@D);
    ar -crs "$@" $^;
...