Генерация списка сгенерированных источников (по-другому) в automake - PullRequest
2 голосов
/ 16 сентября 2011

В настоящее время я работаю над проектом, использующим шаблоны довольно широко, и сталкиваюсь с ограничениями памяти при создании экземпляров. Я разделил инстанцирование на несколько очень простых файлов, которые состоят только из трех строк и включают только включения.

Я позволил им генерироваться правилом в Makefile.am. Теперь у меня есть довольно длинный список файлов, которые должны быть сгенерированы в моем Makefile, и я хотел бы реорганизовать этот список с помощью foreach-подобного выражения. В более конкретном плане: у меня есть строка вроде

libfoo_la_SOURCES = a_0.cpp a_1.cpp ... b_0.cpp b_1.cpp ... c_0.cpp c_1.cpp ...

, который может быть более кратко выражен как

libfoo_la_SOURCES = $(foreach i,a b ...,$(foreach j,0 1 ...,$i_$j.cpp))

Тем не менее, вторая конструкция не только предупреждается automake, но и не работает: файлы, указанные таким образом, не компилируются и не очищаются.

Мой текущий обходной путь - создание этого списка файлов сценарием оболочки.

Есть идеи, как реализовать эту итерацию?

Ответы [ 2 ]

4 голосов
/ 18 сентября 2011

Я бы забыл о создании циклов: расширение GNU не является стандартным и не понимается Automake. Одна стандартная (и переносимая) конструкция make, которую вы можете использовать здесь, - это расширение макроса с подстановкой : $(var:subst1=subst2) расширится до значения $(var) после замены любого суффикса subst1 слова на subst2. Automake это понимает.

Если subst1 пусто, как в $(var:=subst2), вы добавляете subst2 ко всем файлам в $(var). Вы можете использовать это для составления списка файлов следующим образом:

f = a b c d e f
g = $(f:=_0) $(f:=_1) $(f:=_2) $(f:=_3)
all_files = $(g:=.cpp)

echo:
        @echo $(all_files)

Запуск make echo с указанным выше Makefile отобразит все файлы от a_0.cpp до f_3.cpp.

1 голос
/ 16 сентября 2011

Как и вы, я обнаружил, что функция GNU make foreach не будет работать так, потому что источники должны быть там во время генерации Makefile. Итак, я использую GNU Autogen (также здесь ) для генерации фрагмента make-файла, который впоследствии включается в Makefile.am. Так что это, вероятно, не так уж отличается от вашего подхода сценария оболочки.

...